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

Xpath for retrieving all the tags inside parent

使用 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>

预期输出:

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

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

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

要检索单个结果,对于像

这样的输入
<cell><para> <ref> </ref> <ref> </ref> </para>  </cell>

使用以下 XPath 表达式

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

在这种情况下,将产生

0

编辑:正如 Sean B. Durkin 指出的那样,这仅适用于 XPath 1.0。这在 Xpath 2.0 和 3.0 中是可能的,其中 XPath 函数可以是轴步骤并且序列总是被完全计算。有关 XPath 2.0 解决方案,请参阅

如果您使用的是 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)