获取XPath 1.0元素的位置

时间:2013-11-20 09:11:41

标签: xml xpath

我正在创建和设置XML文件样式,并且在尝试为祖先内部的元素赋予编号时遇到问题。我正在处理的XML的等效代码是:

<A>
  <B>
    <C>
      <D>Text 1</D>
      <D>Text 2</D>
      <D>Text 3</D>
    </C>
  </B>
  <B>
    <C>
      <D>Text 4</D>
      <D>Text 5</D>
    </C>
  </B>
</A>
<A>
  <B>
    <C>
      <D>Text 6</D>
      <D>Text 7</D>
      <D>Text 8</D>
    </C>
  </B>
</A>

必须在每个“A”上重新开始编号,为此,我试图将每个“D”的位置放在其“A”祖先中。

我尝试使用类似count(preceding-sibling::D)+1的表达式,但编号会在每个“C”元素上重新开始。我也尝试使用count(preceding::D)+1,但它不起作用,因为它选择了文档中所有以前的“D”元素。

结果应该是:
     - 文本1和6 - &gt;位置1      - 文本2和7 - &gt;位置2
     - 文本3和8 - &gt;位置3
     - 文本4 - &gt;位置4
     - 文本5 - &gt;位置5

我怎么能只计算每个“A”的前面“D”元素?

3 个答案:

答案 0 :(得分:1)

如果结构与你的例子建议一样规则(即Ds总是在B里面的C里面)那么你可以使用像

这样的东西
count(preceding-sibling::D) + count(ancestor::B/preceding-sibling::B//D) + 1

(当前C中此前一个Ds的Ds加上同一A中所有前面Bs中的总数)。

如果不是那么规律,你可以使用“差异”方法:

count(preceding::D) - count(ancestor::A/preceding::D) + 1

(文档中任意位置之前的Ds总数减去当前A之前的数字)。

答案 1 :(得分:0)

我认为你正在寻找祖先,而不是先前兄弟。

答案 2 :(得分:0)

使用更简单的xsl:number ...

,而不是使用count()
<xsl:number from="A" level="any"/>

使用XML输入的示例...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="D">
        <xsl:value-of select="."/>
        <xsl:text> --> </xsl:text>
        <xsl:number from="A" level="any"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

<强>输出

Text 1 --> 1
Text 2 --> 2
Text 3 --> 3
Text 4 --> 4
Text 5 --> 5
Text 6 --> 1
Text 7 --> 2
Text 8 --> 3