Xml 仅计算特定元素

Xml 仅计算特定元素,xml,xslt,Xml,Xslt,编辑:抱歉,问题有点不清楚,我正在尝试返回p节点及其子节点中的所有文本,同时计算各个p节点。So指的是第一个p节点,第二个p节点,依此类推 我试图计算单个元素的出现次数,而不管它出现在xml文档的结构中的什么位置。我尝试了不同的位置和计数,无论有无循环,似乎都找不到任何有效的方法。有人知道怎么做吗 一个例子是: <text> <body> <div1> <p>abc</p> <div

编辑:抱歉,问题有点不清楚,我正在尝试返回p节点及其子节点中的所有文本,同时计算各个p节点。So指的是第一个p节点,第二个p节点,依此类推

我试图计算单个元素的出现次数,而不管它出现在xml文档的结构中的什么位置。我尝试了不同的位置和计数,无论有无循环,似乎都找不到任何有效的方法。有人知道怎么做吗

一个例子是:

<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
号码是你在这里的朋友。用这个就可以得到号码

<xsl:number select="p" level="any" />
这将输出以下内容

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

请注意,如果您有任何文本输出,请使用模板匹配文本来停止除p以外的元素中的文本。

在看到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>
输出


这个问题还不清楚。期望输出中的数字代表什么?它们显然不是位置或计数。为什么在这里缺少亚当-的字符串值?请解释一下,亚当在jkl之后在场。我正在尝试提取p和所有子节点的文本。Borodin,文本节点不能有文本节点的祖先。此外,由于某些原因,您的转换不会仅显示空白文本节点。我们需要在XSLT转换中明确地消除这些限制,并且不要依赖所使用的XML解析器的行为和外部设置。@DimitreNovatchev:您所说的有意义:从逻辑上讲,文本节点只能是子轴或子轴的成员。最初我有一个祖先::*/text,实验告诉我,祖先::text使用我访问过的所有引擎是等效的。Saxon、.NET和MSXML的工作方式完全相同。对于所有空白文本节点;为什么不解决这个问题呢?这很接近,但我试着只计算p节点。如果adam没有从输出中删除,后面跟着mno qrs,这就是我要寻找的。@Borodin,祖先::text没有选择任何内容-根据定义,文本节点没有子节点。我没有看到xsl:strip-space指令——可能是在看TimC的代码。
<?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