获取所有<pro> -Tags in different layers </pro>

时间:2011-09-05 15:09:26

标签: xml xslt xpath

我得到了一个这样的XML文档:

<PUB>
   <PGR>
      <PGR>
         <PGR>
            <PRO>
            <PRO>
            <PRO>
         </PGR>
         <PRO>
         <PRO>
     ....

所以PRO标签位于不同的层,但我想访问所有PRO标签。 我该怎么做?

3 个答案:

答案 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>&#xA0;</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>