-2

编辑:对不起,这个问题有点不清楚,我试图在计算单个 p 节点的同时返回 p 节点及其子节点中的所有文本。所以 <1> 指第一个 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
4

2 回答 2

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输出(如果有的话)。

于 2013-04-08T21:13:31.397 回答
0

在看到蒂姆的回答之前,我认为您可能对任何地方的任何文本节点都感兴趣。

我仍然不确定你的意思只是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
于 2013-04-08T21:36:43.630 回答