0

我有一个看起来像这样的 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>

如何<p xml:id="countelement"></p>使用 XPath 计算元素之前的数字元素?

编辑: 我只想计算父部分中的图形元素,在下一部分中它应该再次从 0 开始。

4

2 回答 2

1

假设您使用的是XPath 2.0 兼容引擎,请找到 count 元素并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/>元素的“countelements”,则替换p*.

于 2013-02-18T14:16:05.577 回答
0

count(id("countelement")/preceding-sibling::figure)

请注意,xml:id两个不同元素的属性值不能相同,例如“countelement”。如果您希望两个不同的元素具有具有相同值“countelement”的同名属性,则它必须是某个其他属性,例如不是 DTD 属性类型 ID 的“kind”。在那种情况下,id("countelement")你会使用*[@kind="countelement"].

于 2013-02-18T13:48:38.000 回答