XPATH,用于将节点与通配符匹配,并且具有一个属性,但没有另一个属性



又一次,一个xpath让我的生活变得艰难。我需要做的是找到所有有@ModuleGUID但没有@PresetGUID的"Module_X"节点。在此示例中,它应同时匹配两个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 但没有预设 GUID 的modules_0,但我仍然无法找到如何组合"必须有和一定没有"的东西

尝试了大量这样的组合,但没有一个对我有用:

//Module_0[@ModuleGuid and not(@PresetGuid)]

编辑:这个简化的示例不起作用,我不知道"在缺少的地方匹配"语法的正确语法。最终的 XPATH 看起来像这样

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

XPath 区分大小写。而不是预设GUID,它是预设GUID等等...另外,我假设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>

这个 XPath,

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

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

相关内容

最新更新