给出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查询,该查询返回根的所有后代,这些后代具有itemprop
属性,但不是&#34;嵌套&#34;的后代。具有itemscope
属性的元素。
也就是说,我想要所有root的属性,但不是嵌套作用域中的属性。
我相信在XPath 1.0中无法做到这一点。我的天真尝试:/descendant::*[not(@itemscope)]//*[@itemprop]
会返回所有itemprop
个包含祖先没有itemscope
属性的元素
编辑:我需要一个足够通用的解决方案,它可以在文档的每个级别(而不仅仅是根目录)中获取itemprops
。例如,在我的例子中,获取&#34; d&#34;
答案 0 :(得分:1)
//div[not(ancestor::div[ancestor::div[./@itemscope]]/@itemscope)]/@itemprop
阅读:所有没有祖先itemscope
的div,他自己有一个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返回:
Attr itemprop b
Attr itemprop c
Attr itemprop e
答案 1 :(得分:1)
使用此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
属性的字符串值。
在此源XML文档上评估上述XPath表达式时(提供的那个,但已更正为使其成为格式良好的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