什么是XPath表达式,我将用于获取每个书的“HarryPotter:”后面的字符串。
即。给定这个XML:
- <bookstore>
- <book>
- HarryPotter:Chamber of Secrets
- </book>
- <book>
- HarryPotter:Prisoners in Azkabahn
- </book>
- </bookstore>
我会回来:
- Chamber of Secrets
- Prisoners in Azkabahn
我已经尝试过这样的事情:
- /bookstore/book/text()[substring-after(.,'HarryPotter:')]
我认为我的语法不正确…
在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>
这个转换产生了想要的结果:
密室阿兹卡班的囚犯