En XPath 2.0 este puede ser producido por una sola expresión XPath:
/*/*/substring-after(., 'HarryPotter:')
Aquí estamos utilizando la característica muy potente de XPath 2.0 que en el extremo de una ruta de pasos de ubicación podemos poner una función y esta función se aplicará a todos los nodos en el conjunto de resultados actual.
En XPath 1.0 no existe tal característica y esto no se puede lograr en una expresión XPath.
Podríamos realizar una transformación XSLT como el siguiente:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="/*/*[substring-after(., 'HarryPotter:')]">
<xsl:value-of select=
"substring-after(., 'HarryPotter:')"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
cuando se aplica sobre el documento XML original:
<bookstore>
<book> HarryPotter:Chamber of Secrets </book>
<book> HarryPotter:Prisoners in Azkabahn </book>
</bookstore>
esta transformación produce el resultado deseado:
Cámara de Secretos
Prisioneros en Azkabahn
Por el contrario, XPath 1.0 * does * tiene substring-after: http://www.w3.org/TR/xpath/#function-substring- after –
@ Josh-Stodola, ¿Dónde dije que no tiene la función substring-after()? XPath 1.0 * no permite * que se especifique una función como paso de ubicación, si esto es subserie posterior() o cualquier otra función. Por favor, ¡revierte su * downvote * incorrecto! –
Josh no sabe quién es Dimitre :) – grantwparks