В XPath 2.0 это можно получить одним выражением XPath:
/*/*/substring-after(., 'HarryPotter:')
Здесь мы используем очень мощную функцию XPath 2.0, заключающуюся в том, что в конце этапа определения местоположения мы можем поместить функцию, и эта функция будет применяться ко всем узлам в текущем наборе результатов.
В XPath 1.0 такой функции нет , и это невозможно сделать в одном выражении XPath.
Мы могли бы выполнить XSLT-преобразование следующим образом:
<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>
При применении к исходному документу XML:
<bookstore>
<book> HarryPotter:Chamber of Secrets </book>
<book> HarryPotter:Prisoners in Azkabahn </book>
</bookstore>
это преобразование дает желаемый результат:
Тайная комната
Заключенные в Азкабане