是否有xpath语句来消除2个具有相同名称但属性不同的元素的歧义?

时间:2019-07-15 18:51:30

标签: xml xpath xpath-1.0

我有一个xml文件,其中包含具有相同name元素的typedef枚举和纯枚举。我想通过使用xpath语句的属性消除它们的歧义。我必须使用xpath1.0。

我已经尝试了几种现有的答案,但是似乎没有一个答案能回答我的歧义问题。例: How do I identify duplicate nodes in XPath 1.0 using an XPathNavigator to evaluate?

我尝试了以下语句,希望消除重复,但它似乎不起作用,无论如何也不会消除节点歧义:

/*/*/member[name = following-sibling::member/name and not(name = preceding-sibling::member/name)]

我的xml示例:

<member kind="enum"><name>myEnum</name></member>
<member kind="typedef"><name>myEnum></name></member>

所需结果: 当名称元素重复时,我要提取typedef枚举而不是普通枚举。

1 个答案:

答案 0 :(得分:0)

例如:
如果您将以下XML作为输入文件

<a class="my-class">
    <c>
        <member kind="enum">
            <name>myEnum111</name>
        </member>
        <member kind="typedef">
            <name>myEnum444></name>
        </member>
    </c>
    <d>
        <member kind="enum">
            <name>myEnum222</name>
        </member>
    </d>
    <d>
        <member kind="whatever">
            <name>myEnum666</name>
        </member>
        <member kind="else">
            <name>myEnum777</name>
        </member>
        <member kind="typedef">
            <name>myEnum000</name>
        </member>
        <member kind="itmaybe">
            <name>myEnum999</name>
        </member>
    </d>
</a>

及以下作为XPath-1.0表达式

/*/*/member[(count(../member) = 1 and contains(name,'myEnum')) or (count(../member) > 1 and @kind='typedef')]

它将为您提供此(正确)输出:

<?xml version="1.0"?>
<member kind="typedef">
    <name>myEnum444&gt;</name>
</member>
<member kind="enum">
    <name>myEnum222</name>
</member>
<member kind="typedef">
    <name>myEnum000</name>
</member>

这是

所要求的输出
  

[...]复制名称元素时,我要提取typedef枚举而不是普通枚举。

如果有多个typedef属性节点,则该行为未定义((可能)返回第一个)。