后代包含 parent 文本的所有节点的 XPath?
XPath for all nodes where descendant contains text of parent?
我正在尝试检索以下表达式中的所有 <t>
个节点:
<x>
<t>10
<s>,14,14,16,</s>
</t>
<t>12
<s>,14,14,16,</s>
</t>
<t>14
<s>,14,14,16,</s>
</t>
<t>14</t>
</x>
条件是 child 节点应包含来自 <t>
的文本。因此我尝试了以下方法:
//t[.//*[contains(., ',')]]
这很好地检索了后代包含逗号的所有 <t>
节点。但是我想回顾一下它的 parent。实际上看起来像://t[.//*[contains(., concat(',', /.., ','))]]
。然而这个 returns no 匹配。
显然我在这里做错了什么。我的预期结果只有 14
。是否可以引用后代,而另一个返回它的 parent?如果是这样,正确的语法是什么?
你可以使用类似的东西:
//s[contains(.,number(string(parent::t/text())))]/..
输出:
<t>
14
<s>,14,14,16,</s>
</t>
另一种选择:
//s[substring(.,2,2)=number(string(parent::t/text()))]/..
编辑:修复误报:
//s[contains(.,concat(",",normalize-space(parent::t/text()),","))]
这个 XPath,
//t[contains(s,normalize-space(text()[1]))]
将 select 所有 t
元素,其第一个空白规范化文本节点被发现作为其 s
子元素的子字符串。
请注意,对于
这样的情况,这可能会产生误报
<t>1
<s>,14,14,16,</s>
</t>
可以很容易地修改 XPath idiom for space-separated classes 来避免这个问题:
//t[contains(concat(' ', translate(s,',',' '), ' ') ,
concat(' ', normalize-space(text()[1]), ' '))]
我正在尝试检索以下表达式中的所有 <t>
个节点:
<x>
<t>10
<s>,14,14,16,</s>
</t>
<t>12
<s>,14,14,16,</s>
</t>
<t>14
<s>,14,14,16,</s>
</t>
<t>14</t>
</x>
条件是 child 节点应包含来自 <t>
的文本。因此我尝试了以下方法:
//t[.//*[contains(., ',')]]
这很好地检索了后代包含逗号的所有 <t>
节点。但是我想回顾一下它的 parent。实际上看起来像://t[.//*[contains(., concat(',', /.., ','))]]
。然而这个 returns no 匹配。
显然我在这里做错了什么。我的预期结果只有 14
。是否可以引用后代,而另一个返回它的 parent?如果是这样,正确的语法是什么?
你可以使用类似的东西:
//s[contains(.,number(string(parent::t/text())))]/..
输出:
<t>
14
<s>,14,14,16,</s>
</t>
另一种选择:
//s[substring(.,2,2)=number(string(parent::t/text()))]/..
编辑:修复误报:
//s[contains(.,concat(",",normalize-space(parent::t/text()),","))]
这个 XPath,
//t[contains(s,normalize-space(text()[1]))]
将 select 所有 t
元素,其第一个空白规范化文本节点被发现作为其 s
子元素的子字符串。
请注意,对于
这样的情况,这可能会产生误报<t>1
<s>,14,14,16,</s>
</t>
可以很容易地修改 XPath idiom for space-separated classes 来避免这个问题:
//t[contains(concat(' ', translate(s,',',' '), ' ') ,
concat(' ', normalize-space(text()[1]), ' '))]