确定具有给定名称的任何元素是否具有特定值

时间:2013-07-10 13:16:50

标签: xpath

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

谢谢你们!

2 个答案:

答案 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表达式中省略它。