子代包含父代文本的所有节点的XPath?

时间:2020-07-21 13:30:38

标签: xml xpath xpath-1.0

我正在尝试检索以下表达式中的所有<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。是否可以引用后代,然后再引用其后代?如果是这样,正确的语法是什么?

2 个答案:

答案 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]), ' '))] 
相关问题