【问题标题】:XPath to get parents with multiple children but only one type of childXPath 让父母有多个孩子但只有一种孩子
【发布时间】:2015-12-16 11:05:40
【问题描述】:

我需要一个 XPath (1.0) 来获取具有多个子节点但只有一种子节点的所有父节点(例如,<div><li> 但不是 <div><li>)。有什么帮助吗?谢谢!

<doc>
    <tom>
        <janet />
    </tom>
    <dick>
        <janet />
        <jane />
    </dick>
    <harry>
        <jane />
    </harry>
</doc>

所以对于上述内容,我们应该得到汤姆和哈利,而不是迪克

【问题讨论】:

  • 一个例子会很有帮助;-)
  • 我不确定这个例子是否对这个问题特别有帮助,因为它通常解决是否有办法检查子元素是否都属于同一类型。

标签: xpath


【解决方案1】:

使用示例作为参考,以下 XPath 1.0 表达式:

/doc/*[count(./*) = count(./*[name(.) = name(../*[1])])]

将返回 doc 的所有子元素,其中该元素的子元素总数等于与该元素的第一个子元素同名的子元素的数量。或者,更简单地说,所有孩子都有相同的名字,也就是“类型”。

但是,上面会返回有 0 个或 1 个子节点的节点,因此要将其限制为仅具有多个子节点的节点,我们可以使用: /doc/*[count(./*) = count(./*[name(.) = name(../*[1])]) and count(./*) &gt; 1]

如果你想进一步限制它,使所有子元素都必须是某个元素,例如jane,你可以使用:/doc/*[count(./*) = count(./*[name(.) = name(../*[1])]) and count(./*) &gt; 1 and ./*[1] = ./jane[1]]

【讨论】:

  • 非常聪明的解决方案,谢谢!如果对路径没有进一步的限制,我想//*[count(./*) = count(./*[name(.) = name(../*[1])]) and count(./*) &gt; 1]可以考虑作为这个问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2015-03-26
  • 1970-01-01
  • 2012-12-07
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多