XPath 2.0:查找所有后代匹配条件 X,但没有祖先匹配条件 Y
XPath 2.0: Find all descendants matching criteria X, but with no ancestor matching criteria Y
给定 xml:
<div itemtype="..." itemscope value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope itemprop="..." value="4"> <!-- and even this -->
<div itemprop value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop value="7" > <!-- nor this -->
</div>
</div>
</div>
我正在尝试构建一个 xpath 查询,该查询 returns 根的所有后代,它们具有 itemprop
属性,但不是具有 "nested" 元素的后代 itemscope
属性。
也就是说,我想要根的所有属性,而不是嵌套范围内的属性。
我相当确信这不能在 XPath 1.0 中完成。我天真的尝试:/descendant::*[not(@itemscope)]//*[@itemprop]
returns 所有 itemprop
的元素都有一些没有 itemscope
属性的祖先
编辑:我需要一个足够通用的解决方案,它将用于在文档的每个级别获取 itemprops
,而不仅仅是根。例如,在我的示例中,获取 "d"
的属性
怎么样//div[not(ancestor::div[ancestor::div[./@itemscope]]/@itemscope)]/@itemprop
阅读:所有 div 没有 itemscope
祖先的人,他们自己有 itemscope
祖先,获取 itemprop 属性
我必须进行一些更改,因为您的 XML 并不真正 XML 合规:
<root>
<div itemtype="a" itemscope="" value="root">
<div itemprop="b" value="1" />
<!-- want this -->
<div value="2">
<div itemprop="c" value="3" />
<!-- and this -->
</div>
<div itemtype="d" itemscope="" itemprop="e" value="4">
<!-- and even this -->
<div itemprop="f" value="5" />
<!-- but not this -->
<div value="6" >
<div itemprop="g" value="7" />
<!-- nor this -->
</div>
</div>
</div>
</root>
XPath returns:
Attr itemprop b
Attr itemprop c
Attr itemprop e
使用这个 XPath 1.0 表达式:
//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]
这将选择所有具有 itemprop
属性但不具有具有 itemscope
属性祖先的元素,即(此祖先)具有父元素(这意味着它不是文档元素本身)。
为了验证是否确实选择了想要的元素,请使用这个稍微修改过的表达式(修改后使其成为 XPath 2.0 表达式):
//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]/@value/string()
这会生成每个选定元素的 value
属性的字符串值。
当上面的 XPath 表达式被评估时 在此源 XML 文档(提供的文档,但已更正以使其成为格式正确的 XML文档:
<div itemtype="..." itemscope="x" value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope="x" itemprop="..." value="4"> <!-- and even this -->
<div itemprop="..." value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop="..." value="7" /> <!-- nor this -->
</div>
</div>
</div>
产生了想要的、正确的结果:
1 3 4
给定 xml:
<div itemtype="..." itemscope value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope itemprop="..." value="4"> <!-- and even this -->
<div itemprop value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop value="7" > <!-- nor this -->
</div>
</div>
</div>
我正在尝试构建一个 xpath 查询,该查询 returns 根的所有后代,它们具有 itemprop
属性,但不是具有 "nested" 元素的后代 itemscope
属性。
也就是说,我想要根的所有属性,而不是嵌套范围内的属性。
我相当确信这不能在 XPath 1.0 中完成。我天真的尝试:/descendant::*[not(@itemscope)]//*[@itemprop]
returns 所有 itemprop
的元素都有一些没有 itemscope
属性的祖先
编辑:我需要一个足够通用的解决方案,它将用于在文档的每个级别获取 itemprops
,而不仅仅是根。例如,在我的示例中,获取 "d"
怎么样//div[not(ancestor::div[ancestor::div[./@itemscope]]/@itemscope)]/@itemprop
阅读:所有 div 没有 itemscope
祖先的人,他们自己有 itemscope
祖先,获取 itemprop 属性
我必须进行一些更改,因为您的 XML 并不真正 XML 合规:
<root>
<div itemtype="a" itemscope="" value="root">
<div itemprop="b" value="1" />
<!-- want this -->
<div value="2">
<div itemprop="c" value="3" />
<!-- and this -->
</div>
<div itemtype="d" itemscope="" itemprop="e" value="4">
<!-- and even this -->
<div itemprop="f" value="5" />
<!-- but not this -->
<div value="6" >
<div itemprop="g" value="7" />
<!-- nor this -->
</div>
</div>
</div>
</root>
XPath returns:
Attr itemprop b
Attr itemprop c
Attr itemprop e
使用这个 XPath 1.0 表达式:
//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]
这将选择所有具有 itemprop
属性但不具有具有 itemscope
属性祖先的元素,即(此祖先)具有父元素(这意味着它不是文档元素本身)。
为了验证是否确实选择了想要的元素,请使用这个稍微修改过的表达式(修改后使其成为 XPath 2.0 表达式):
//*[@itemprop and not(ancestor::*[parent::* and @itemscope])]/@value/string()
这会生成每个选定元素的 value
属性的字符串值。
当上面的 XPath 表达式被评估时 在此源 XML 文档(提供的文档,但已更正以使其成为格式正确的 XML文档:
<div itemtype="..." itemscope="x" value="root">
<div itemprop="..." value="1" /> <!-- want this -->
<div value="2">
<div itemprop="..." value="3" /> <!-- and this -->
</div>
<div itemtype="..." itemscope="x" itemprop="..." value="4"> <!-- and even this -->
<div itemprop="..." value="5" /> <!-- but not this -->
<div value="6" >
<div itemprop="..." value="7" /> <!-- nor this -->
</div>
</div>
</div>
产生了想要的、正确的结果:
1 3 4