XPath 2.0:查找匹配条件X的所有后代,但没有祖先匹配条件Y.

时间:2015-01-21 16:37:02

标签: xml xpath-2.0

给出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;

的属性

2 个答案:

答案 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