我得到了一个这样的XML文档:
<PUB>
<PGR>
<PGR>
<PGR>
<PRO>
<PRO>
<PRO>
</PGR>
<PRO>
<PRO>
....
所以PRO标签位于不同的层,但我想访问所有PRO标签。 我该怎么做?
答案 0 :(得分:4)
由于此问题已标记为XSLT,您可能需要:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/*">
<xsl:apply-templates select=".//PRO"/>
</xsl:template>
<xsl:template match="PRO">
<!-- enjoy PRO -->
</xsl:template>
</xsl:stylesheet>
请注意,与正常情况不同,.
在应用模板时的使用是相关的。事实上,通过这种方式,我们从当前匹配节点( PUB )开始选择所有 PRO 元素,同时:
<xsl:apply-templates select="//PRO"/>
无论当前节点是什么,都会将模板应用于从文档根目录匹配的所有 PRO 元素。
答案 1 :(得分:1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
<xsl:apply-templates select="//PRO"/>
</xsl:template>
<xsl:template match="PRO">
<xsl:value-of select="generate-id()"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
使用此XPath表达式:
//PRO
这将选择XML文档中名为PRO
的所有元素。
根据XPath 1.0 W3C Recommendation ,
的缩写
//
是/descendant-or-self::node()/
因此,上面的XPath表达式相当于更长的时间:
/descendant-or-self::node()/PRO
通常建议尽可能避免使用//
伪操作符,因为它会导致扫描完整的XML文档。只要有可能。使用尽可能多的上下文来构造更具体的XPath表达式,以便更有效地评估它。
例如,如果在给定的XML文档中,很明显可以使用XPath表达式选择所需的元素c
:
/a/b/c
使用它,绝不使用:
//c
执行速度的差异有时会达到数百或数千次。
或者,在XSLT中只使用模板模式匹配 - 这可能是访问和处理任何XML文档中所有(且仅)PRO
元素的最短转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="PRO">
<!-- Your code here -->
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>