Uso (suponiendo que el fragmento de XML proporcionado es elementos que son secundarios del nodo actual y solo hay un elemento con la propiedad deseada):
substring-before(*[not(starts-with(., 'info:eu-repo'))], '-')
XSLT - verificación basada:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select=
"substring-before(*[not(starts-with(., 'info:eu-repo'))], '-') "/>
</xsl:template>
</xsl:stylesheet>
Cuando se aplica esta transformación para el siguiente documento XML (el fragmento proporcionado envuelto en un elemento superior solo y el espacio de nombres declarado):
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
</t>
La expresión XPath se evalúa desde el elemento superior y el re sultado de esta evaluación se copia a la salida:
2012
II. Más de un elemento con la propiedad deseada:
En este caso No es posible generar los datos deseados con una única expresión XPath 1.0.
Esta transformación XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[not(starts-with(., 'info:eu-repo'))]/text()">
<xsl:copy-of select="substring-before(., '-') "/>
==============
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
cuando se aplica en este documento XML:
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2011-07-05</dc:date>
</t>
produce el, resultado correcto deseada:
2012
==============
2011
==============
III. XPath 2.0 de una sola línea
*[not(starts-with(., 'info:eu-repo'))]/substring-before(., '-')
Cuando esto XPath 2.0 expresión se evalúa fuera el elemento superior del anterior documento de XML (el más cercano arriba), los años deseados se producen:
2012 2011
XSLT 2.0 - basado en la verificación:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:sequence select=
"*[not(starts-with(., 'info:eu-repo'))]/substring-before(., '-')"/>
</xsl:template>
</xsl:stylesheet>
Cuando se aplica esta transformación en el último documento XML, la expresión XPath se evalúa y el resultado de esta evaluación se copia a la salida:
2012 2011
IV. El caso más general y difícil:
Ahora, vamos a tener este documento XML:
<t xmlns:dc="some:dc">
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2012-07-04</dc:date>
<dc:date>info:eu-repo/date/embargoEnd/2013-06-12</dc:date>
<dc:date>2011-07-05</dc:date>
<dc:date>*/date/embargoEnd/2014-06-12</dc:date>
</t>
Todavía queremos obtener la parte del año de todos los dc:date
elementos cuyo valor de cadena no comienza con 'información: eu-repo '. Sin embargo, ninguna de las soluciones anteriores funciona correctamente con el último elemento dc:date
anterior.
Sorprendentemente, los datos deseados pueden todavía ser producido por un solo XPath 2.0 expresión:
for $s in
*[not(starts-with(., 'info:eu-repo'))]/tokenize(.,'/')[last()]
return
substring-before($s, '-')
Cuando esta expresión se evalúa fuera el elemento superior del documento XML anterior, el, resultado correcto deseado se produce:
2012 2011 2014
Y este es el XSLT 2.0 - la verificación basada:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:sequence select=
"for $s in
*[not(starts-with(., 'info:eu-repo'))]/tokenize(.,'/')[last()]
return
substring-before($s, '-')
"/>
</xsl:template>
</xsl:stylesheet>
intenté sin 'pero no funciona. el resultado que obtuve 2012 publicaciónAño> información publicaciónAño> –
He editado mi respuesta. Parece que tienes un problema de iteración también. – DRCB
gracias, lástima de mí, puse la prueba fuera de la iteración –