用于检索父级内所有标记的Xpath

时间:2015-01-30 06:31:31

标签: xpath

使用xpath:

在父标记内查找特定标记

示例输入:

<Table>
    <Tbody>
        <Row> 
            <cell><para> <ref> </ref> <ref> </ref> </para>  </cell>
        </Row>
        <Row>
            <cell><para>  <a1> </a1><ref> </ref> </para>  </cell>
        </Row>
        <Row>
            <cell><para>  <ref> </ref></para>  </cell>
        </Row>
        <Row>
            <cell><para>  <b1> </b1></para>  </cell>
        </Row>
        <Row>
            <cell><para>  <b1> </b1> <c1> </c1></para>  </cell>
        </Row>
        <Row>
            <cell><para>  <ref> </ref> <c1> </c1></para>  </cell>
        </Row>
    <Thead>

预期产出:

  • cell1-para它应该返回0
  • cell2-para它应该返回1
  • cell3-para它应该返回0
  • cell4-para它应该返回1
  • cell5-para它应该返回2
  • cell6-para它应该返回1

如何找出单元格内非ref标签的数量?

para中可能有多个标签。名字可能是任何东西。但我们只需要检查ref。

2 个答案:

答案 0 :(得分:1)

XPath无法返回每个para元素的结果 - 这是你应该在更高级语言XPath中嵌入的东西(例如,XSLT,XQuery,Java,PHP,Python,Perl)。 ..)。

之类的输入检索单个结果
<cell><para> <ref> </ref> <ref> </ref> </para>  </cell>

使用以下XPath表达式

count(//para/*[not(self::ref)])

,在这种情况下,将产生

0

编辑:这只适用于XPath 1.0,正如Sean B. Durkin指出的那样。在Xpath 2.0和3.0中,XPath函数可以是轴步,并且始终完全评估序列。有关XPath 2.0解决方案,请参阅Sean's answer

答案 1 :(得分:1)

如果您使用的是XPath 2.0或3.0,并且焦点节点是Table的父节点,那么以下表达式......

Table/Tbody/Row/cell/para/count(decendant::ref)

...当应用于给定的样本输入文档时,将评估xs:integer ...

的这个序列
(0,1,0,1,2,1)

只是为了好玩,这里有一个等价的替代表达式......

for $p in Table/Tbody/Row/cell return count($p//ref)