我有一个xml结构,如下所示:
<document>
<body>
<section>
<title>something</title>
<subtitle>Something again</subtitle>
<section>
<p xml:id="1234">Some text</p>
<figure id="2121"></figure>
<section>
<p xml:id="somethingagain">Some text</p>
<figure id="939393"></figure>
<p xml:id="countelement"></p>
</section>
</section>
</section>
<section>
<title>something2</title>
<subtitle>Something again2</subtitle>
<section>
<p xml:id="12345678">Some text2</p>
<figure id="939394"></figure>
<p xml:id="countelement2"></p>
</section>
</section>
</body>
</document>
如何使用XPath计算<p xml:id="countelement"></p>
元素之前的数字elemtens?
修改 我只想计算父节中的数字元素,在下一节中它应该从0开始。
答案 0 :(得分:1)
鉴于您使用的是 XPath 2.0兼容引擎,请找到count元素并使用所有前面的figure-element作为输入为每个引用fn:count()
。
这将返回同一级别上每个“countelement”之前的数字(我猜这是你真正想要的):
//p[@xml:id="countelement"]/count(preceding-sibling::figure)
这将返回每个“countelement”之前的数字和上面的数字:
//p[@xml:id="countelement"]/count(preceding-sibling::figure | parent::*/preceding-sibling::figure)
这将返回每个“countelement”之前的所有前面数字的数字和上面的级别:
//p[@xml:id="countelement"]/count(preceding::figure)
如果您受 XPath 1.0 的约束,您将无法获得多个结果。如果@id
确实是一个id(因此是唯一的),您将能够使用此查询:
count(//p[@xml:id="countelement"]/preceding::figure)
如果有“反补贴”不是<p/>
元素,请将p
替换为*
。
答案 1 :(得分:0)
count(id("countelement")/preceding-sibling::figure)
请注意,两个不同元素的xml:id
属性不能相同,例如“countelement”。如果希望两个不同的元素具有相同名称的属性具有相同的值“countelement”,则它必须是某些其他属性,可能是“kind”,而不是DTD属性类型ID。在这种情况下,您将使用id("countelement")
来代替*[@kind="countelement"]
。