如何将节点绑定到xpath中的变量?

时间:2017-08-30 17:12:26

标签: xml xpath

我想找到(绑定)XML中找到的路径上的所有节点。 请考虑以下XML代码段。

<a at="dat1">
    <b at="dat2">
        <c at="dat3">blah</c>
        <c at="dat4">blah</c>
    </b>
    <b at="dat5">
        <c at="dat6">blah</c>
        <c at="dat7">blah</c>
    </b>
</a>
<a at="dat8">
    <b at="dat2">
        <c at="dat4">blah</c>
        <c at="dat9">blah</c>
    </b>
    <b at="dat10">
        <c at="dat9">blah</c>
        <c at="dat4">blah</c>
    </b>
</a>

xpath查询/ a / b [@ at =“dat2”] / c [@ at =“dat4”]将仅返回两个c节点。但是,我想检索满足给定条件的路径(a,b和c)上的所有节点。在这种情况下,我期待a,b,c节点的两个三元组。 xpath表达式可能是任意复杂的。 xpath引擎会找到三元组,但只返回c个节点。

我当然可以编写多个xpath表达式来获取每个元素。但这需要xpath引擎多次搜索,这不是必需的,因为它已经在第一次搜索中找到了所有绑定。

如何在xpath中实现此目的?如果不可能,我应该使用哪种XML查询语言?

2 个答案:

答案 0 :(得分:2)

使用XPath axis ancestor-or-self。它...

  

选择当前节点和当前节点本身的所有祖先(父级,祖父级等)

因此/a/b/c/ancestor-or-self::*将选择所有三个节点。

答案 1 :(得分:1)

尝试以下XPath

/a/descendant-or-self::*

它应该返回a元素以及bc

如果a的后代多于bc,则可以使用下面的情况:

//a/descendant-or-self::*[name()=('a', 'b', 'c')]