鉴于这个XML片段(我已经删除了多余的绒毛):
<Event name="DataComplete">
<Task id="d20a0053-7678-43ba-bc8a-ece24dcff15b"/>
<DataItems>
<DataItem name="Survey" type="task">
<Value status="NotStarted" taskId="00000000-0000-0000-0000-000000000000" />
</DataItem>
<GroupDataItem name="CT_Visit"> --- this may repeat
<ItemGroup id="1" >
<DataItem name="Special Contractor" type="string">Yes</DataItem>
xPath表达式将确定名称=“Special Contractor”的任何DataItem的值是否为“是”。
我正在尝试这样的事情:
Yes = /Event/Task/DataItems/GroupDataItem/ItemGroup/DataItem/@[normalize-space() = 'Special Contractor']
和许多变体通常导致“无效的xPath表达式”。
任何线索都是最受欢迎的。谢谢!
[编辑]
感谢Jiri和Will的回答。 Will很接近,但正如我的问题所述,我正在尝试确定任何*元素是否具有值Yes
。我应该更明确地说我需要一个布尔值,真或假。改编Will的回答让我想到了这个:
"Yes" = //Event/Task/DataItems/GroupDataItem/ItemGroup/DataItem[@name='Special Contractor']
这会返回一个简单的Boolean='true'
或Boolean='false'
。
谢谢你们!
答案 0 :(得分:2)
/Event/DataItems/GroupDataItem/ItemGroup/DataItem[@name = "Special Contractor"][. = "Yes"]
返回有问题的DataItem
。请注意,如果有多个元素,则这将是一系列匹配的DataItem
元素。如果你只想要一个布尔值:
exists(/Event/DataItems/GroupDataItem/ItemGroup/DataItem[@name = "Special Contractor"][. = "Yes"])
(顺便说一句;我从xpath中删除了Task
,因为它实际上并不是你发布的XML片段中DataItem
的祖先,即使缩进使它看起来像是这样。 )
答案 1 :(得分:0)
使用此xpath
/Event/Task/DataItems/GroupDataItem/ItemGroup/DataItem[@name='Special Contractor']
用于跟随xml:
<Event name="DataComplete">
<Task id="d20a0053-7678-43ba-bc8a-ece24dcff15b">
<DataItems>
<DataItem name="Survey" type="task">
<Value status="NotStarted" taskId="00000000-0000-0000-0000-000000000000" />
</DataItem>
<GroupDataItem name="CT_Visit"> --- this may repeat
<ItemGroup id="1" >
<DataItem name="Special Contractor" type="string">Yes</DataItem>
</ItemGroup>
</GroupDataItem>
</DataItems>
</Task>
...
</Event>
如果任务确实是非配对元素,则从xpath表达式中省略它。