1

鉴于这个 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”。

我正在尝试这样的事情:

  Yes = /Event/Task/DataItems/GroupDataItem/ItemGroup/DataItem/@[normalize-space() = 'Special Contractor']

许多变体通常会导致“无效的 xPath 表达式”。

任何线索最受欢迎。谢谢!

[编辑]

感谢 Jiri 和 Will 的回答。Will 很接近,但正如我的问题所述,我正在尝试确定是否有任何* 元素具有 value Yes。我应该更明确地说我需要一个布尔值,真或假。改编威尔的回答让我想到了这一点:

"Yes" = //Event/Task/DataItems/GroupDataItem/ItemGroup/DataItem[@name='Special Contractor'] 

这将返回一个简单的Boolean='true'or Boolean='false'

多谢你们!

4

2 回答 2

2
/Event/DataItems/GroupDataItem/ItemGroup/DataItem[@name = "Special Contractor"][. = "Yes"]

返回有DataItem问题的。DataItem请注意,如果有多个匹配元素,这将是一系列匹配元素。如果你只想要一个布尔值:

exists(/Event/DataItems/GroupDataItem/ItemGroup/DataItem[@name = "Special Contractor"][. = "Yes"])

(顺便说一句;我Task从 xpath 中删除了,因为它实际上不是DataItem您发布的 XML 片段中的祖先,即使缩进使它看起来像它。)

于 2013-07-10T13:28:20.080 回答
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 表达式中省略。

于 2013-07-10T13:29:15.713 回答