后代包含 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]), ' '))]