我正在尝试检索以下表达式中的所有<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>
条件是子节点应包含<t>
中的文本。为此,我尝试了以下操作:
//t[.//*[contains(., ',')]]
这很好地检索了后代包含逗号的所有<t>
节点。但是我想回头看看它的父母。实际上看起来像://t[.//*[contains(., concat(',', /.., ','))]]
。但这会返回 否 匹配项。
很明显,我在这里做错了。我的预期结果仅为14
。是否可以引用后代,然后再引用其后代?如果是这样,正确的语法是什么?
答案 0 :(得分:2)
您可以使用类似:
//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()),","))]
答案 1 :(得分:2)
此XPath,
//t[contains(s,normalize-space(text()[1]))]
将选择所有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]), ' '))]