XPATH用于匹配具有通配符的节点并具有一个属性但不具有另一个属性

时间:2017-10-24 21:08:31

标签: xml xpath

再一个xpath让我的生活变得艰难。我需要做的是找到所有" Module_X"具有@ModuleGUID但没有@PresetGUID的节点。 在此示例中,它应与Module_1匹配。

<xml>
<Parent1>
        <Module_0 ModuleGUID="1" PresetGUID="1">
            <ModuleData />
        </Module_0>
        <Module_1 ModuleGUID="{123}" >
                <ModuleData Complexity="0" />
        </Module_1>
</Parent1>
<Parent2>
            <Module_0 ModuleGUID="4" PresetGUID="5">
                <ModuleData />
            </Module_0>
            <Module_1 ModuleGUID="{456}" >
                    <ModuleData Complexity="0" />
            </Module_1>
</Parent2>
</xml>

我尝试的是减少它并尝试仅匹配具有ModuleGUID但不匹配PresetGUID的modules_0但仍然无法找到如何组合&#34;必须具有AND必须没有&#34;东西

我试过很多这样的组合,但没有一个对我有效:

//Module_0[@ModuleGuid and not(@PresetGuid)]
编辑:这个简化的例子不起作用,我不知道&#34的正确语法;匹配缺少的地方&#34;句法。最终的XPATH看起来像这样

//*[contains(.,'Module_')] [@ModuleGuid and not(@PresetGuid)]

2 个答案:

答案 0 :(得分:1)

XPath区分大小写。而不是PresetGuid,它是PresetGUID等等...另外,我假设contains()需要应用于标记的名称,而不是开放和关闭标记之间的文本。尝试:

//*[contains(local-name(),'Module_') and not(@PresetGUID) and @ModuleGUID]

返回

<Module_1 ModuleGUID="{123}">
    <ModuleData Complexity="0"/>
</Module_1>
<Module_1 ModuleGUID="{456}">
    <ModuleData Complexity="0"/>
</Module_1>

答案 1 :(得分:1)

这个XPath,

//*[starts-with(name(),'Module_')][@ModuleGUID][not(@PresetGUID)]]

将根据要求选择名称以Module_开头但属@ModuleGUID属性但具有@PresetGUID属性的所有元素。