使用XPath 1.0获取元素的位置

伊卡

我正在创建和样式化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->位置1-
文本2和7->位置2-
文本3和8->位置3-
文本4->位置4-
文本5->位置5

我该怎么做才能仅计算每个“ A”中前面的“ D”个元素?

伊恩·罗伯茨(Ian Roberts)

如果结构如您的示例所建议的那样规则(即D始终位于C内,而B内),则可以使用类似

count(preceding-sibling::D) + count(ancestor::B/preceding-sibling::B//D) + 1

(当前C中此D之前的D数,再加上同一A中所有先前B的总数)。

如果不是很常规,则可以使用“差异”方法:

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

(在文档中任何位置之前此D之前的D总数,减去当前A之前的D数)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章