使用XPath查找具有X属性的第一个祖先节点

时间:2014-08-18 21:28:49

标签: html xml xpath

我的DOM中有重复的嵌套结构,我试图在当前节点级别找到某些输入元素。

例如,假设当前节点为<div data-model="user" data-id="1">。如何在没有<input value=foo的情况下获取<input value=bar(因为它位于自己的data-model下)?

<div>
    <div data-model="user" data-id="1">
        <div>
            <input data-field="email" value="foo">

            <div data-model="user" data-id="2">
                <div>
                    <input data-field="email" value="bar">
                </div>
            </div>
        </div>
    </div>
</div>

这是我到目前为止在xpath中的内容:

//*[@data-model="user"]//*[@data-field and ancestor::*[@data-model="user" ....]]

1 个答案:

答案 0 :(得分:1)

你可以分两步完成。首先评估

count(ancestor-or-self::div[@data-model = 'user'])

作为数字,当前div作为上下文节点。然后取这个数字$n并评估

.//input[count(ancestor::div[@data-model = 'user']) = $n]

这里的想法是找到与我们从(包括)开始的上下文节点具有相同数量的包含data-model="user" div的所有后代输入元素。

从XSLT开始,您可以一次性完成此操作,因为您可以访问current()功能,这样您就可以逃脱&#34;来自谓词

.//input[count(ancestor::div[@data-model = 'user']) = 
  count(current()/ancestor-or-self::div[@data-model = 'user'])]

此函数在纯XPath中不可用,但如果您的库允许您将变量绑定传递给表达式,那么您可以在变量中提供上下文节点并使用它来代替current()