又一次,一个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
属性的所有元素。