XPath 1.0计算基于子条件的节点数

时间:2015-04-11 13:02:15

标签: xml xpath

我需要计算XML树中某些节点的数量,直到找到具有特定子节点的节点。

我的XML示例如下所示:

<w:body>
    <w:p w:rsidR="00680C51" w:rsidRDefault="00680C51">
      <w:r>
        <w:t xml:space="preserve">This is </w:t>
      </w:r>
      <w:proofErr w:type="spellStart"/>
      <w:r>
        <w:t>outside</w:t>
      </w:r>
      <w:proofErr w:type="spellEnd"/>
    </w:p>
    <w:p w:rsidR="00680C51" w:rsidRDefault="00680C51"/>
    <w:p w:rsidR="00680C51" w:rsidRDefault="00680C51">
      <w:pPr>
        <w:sectPr w:rsidR="00680C51">
          <w:pgSz w:w="11906" w:h="16838"/>
          <w:pgMar w:top="1701" w:right="1134" w:bottom="1701" w:left="1134" w:header="708" w:footer="708" w:gutter="0"/>
          <w:cols w:space="708"/>
          <w:docGrid w:linePitch="360"/>
        </w:sectPr>
      </w:pPr>
    </w:p>
    <w:p w:rsidR="00680C51" w:rsidRPr="00680C51" w:rsidRDefault="00680C51">
      <w:pPr>
        <w:rPr>
          <w:lang w:val="en-US"/>
        </w:rPr>
      </w:pPr>
      <w:bookmarkStart w:id="1" w:name="Reminder"/>
      <w:bookmarkEnd w:id="1"/>
      <w:r w:rsidRPr="00680C51">
        <w:rPr>
          <w:lang w:val="en-US"/>
        </w:rPr>
        <w:t>Reminder</w:t>
      </w:r>
    </w:p>
</w:body>

我需要做的是创建一个查询,该查询计算有一个名为w:p的子节点的w:sectPr个节点高于某个w:p节点,该节点有一个子节点被调用具有给定w:bookmarkStart属性的name

例如,针对此特定情况的查询结果为1。

在XPath 2.0中,我使用以下查询:

count(//w:bookmarkStart[@w:name = "Reminder"]/ancestor::w:p[1]/preceding-sibling::w:p[*/w:sectPr])]

问题是我不知道如何在XPath 1.0中使用它。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我想出的答案看起来像这样

count(//w:body/*[following-sibling::node()[self::*[descendant-or-self::w:bookmarkStart[@w:name="Reminder"]]]]/*[w:sectPr])

基本上我找到了我正在寻找的bookmarkStart然后我回到XML树上,然后选择包含sectPr的节点。

在XSLT中,这可以作为一种魅力。

This帖子帮助我理解了正在发生的事情