【问题标题】:XPath to get node name based on existence of child nodeXPath 根据子节点的存在获取节点名称
【发布时间】:2016-11-08 13:54:34
【问题描述】:

我有以下节点:

<resource>
    <DataField1>
         <label>...</label>
         <alert>...</alert>
     </DataField1>
     <DataField2>
         <label>...</label>
     </DataField2>
     <DataField3>
        <label>...</label>
        <alert>...</alert>
     </DataField3>
</resource>

并且想显示第一个和第三个节点的名称,因为它存在子节点“alert”。

DataField1
DataField3

使用以下 XPath,我可以显示节点:

 //resource/*[alert]

结果:

<DataField1>
    <label>...</label>
    <alert>...</alert>
</DataField1>
<DataField3>
    <label>...</label>
    <alert>...</alert>
</DataField3>

但这不是我想要的。

【问题讨论】:

  • 你说的“名字”是什么意思?标签?还是 DataField1/3?
  • @Markus,我指的是第二个节点的标签

标签: xml xpath


【解决方案1】:

你只需要添加label:

//resource/*[alert]/label

【讨论】:

  • 抱歉,这不是我想要的。我需要二级节点的名称/标签。描述的很详细
  • XPath 表达式选择resource/DataField1/labelresource/DataField3/label。如果这不是您想要的,请更详细地说明您的结果应该是什么样子。
  • 当我使用 local-name(//resource/*[alert]) 时,它显示 DataField1。但我想要 DataField1 和 DataField3。
  • 这是因为local-name() 从给定的节点集中选择第一个节点。
【解决方案2】:

/resource/*/alert/parent::*

返回

Element='<DataField1>
     <label>...</label>
     <alert>...</alert>
 </DataField1>'
Element='<DataField3>
    <label>...</label>
    <alert>...</alert>
 </DataField3>'

【讨论】:

  • OP 已经显示了相同的输出,用户不想要这样的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
相关资源
最近更新 更多