仅计算特定元素

时间:2013-04-08 20:21:49

标签: xml xslt

编辑:对不起这个问题有点不清楚,我正在尝试在计算单个p节点时返回p节点及其子节点中的所有文本。所以< 1> “第一个p节点”是指第一个p节点,< 2>。到第二个等等。

我正在尝试计算单个元素的出现次数,无论它出现在xml文档的结构中的哪个位置。我已尝试使用和不使用for-each循环的position()和count()的变体,似乎找不到任何可行的东西。任何人都知道如何做到这一点?

示例文档将是:

<text>
   <body>
     <div1>
       <p>abc</p>
         <div2>
           <p>def</p>
         </div2>
     </div1>
     <div1>
       <p>ghi</p>
         <div2>
           <p>jkl <name>adam</name></p>
           <div3>
              <p>mno</p>
           </div3>
         </div2>
     <p>qrs</p>
     </div1>
 </body>
</text>

返回:

<1>abc
<2>def
<3>ghi
<4>jkl adam
<5>mno
<6>qrs

2 个答案:

答案 0 :(得分:0)

xsl:number是你的朋友。只需使用它来获取数字

<xsl:number select="p" level="any" />

请注意在此实例中使用level

试试这个XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" />

   <xsl:template match="p">
       <xsl:number select="p" level="any" />
       <xsl:value-of select="concat(') ', ., '&#10;')" />
   </xsl:template>

   <xsl:template match="text()"/>
</xsl:stylesheet>

这应输出以下内容

1) abc
2) def
3) ghi
4) jkl adam
5) mno
6) qrs

请注意使用匹配text()的模板来停止输出p以外的元素中的文本(如果有的话)。

答案 1 :(得分:0)

在看到Tim的回答之前,我认为您可能对任何文本节点感兴趣

我仍然不确定你的意思是p个节点,所以这里是我的解决方案,它列出了没有文本祖先的所有文本节点,这会产生相同的结果。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">

    <xsl:for-each select="//*[text()][not(ancestor::text())]">
      <xsl:value-of select="concat('&lt;', position(), '&gt; ', current(), '&#x0A;')"/>
    </xsl:for-each>

  </xsl:template>
</xsl:stylesheet>

<强>输出

<1> abc
<2> def
<3> ghi
<4> jkl adam
<5> adam
<6> mno
<7> qrs