如何根据元素的同级属性值从元素中获取文本值?



示例 xml:

<root>
<ns1:agent ns2:about="a3">
<ns2:name xml:lang="en">Helen</ns2:name>
<ns2:age>26</ns2:age>
</ns1:agent>
<ns1:agent ns2:about="a1">
<ns2:name xml:lang="en">John</ns2:name>
<ns2:age>26</ns2:age>
</ns1:agent>
<ns1:agent ns2:about="a2">
<ns2:name xml:lang="en">Mike</ns2:name>
<ns2:age>30</ns2:age>
</ns1:agent>
...
<!-- More ns1:agent nodes -->
...
<ns3:person ns2:id="a1"/>
<ns3:person ns2:id="a2"/>
<ns3:person ns2:id="a3"/>
...
<!-- More ns3:person nodes -->
...
</root>

那么如何使用XPath根据从person元素开始的about属性获取代理/名称元素的文本值呢?

编辑: XPath 表达式将用于循环中,用于每个 ns3:person 节点,所以我事先不知道具体的 id 属性值。

如果我正确理解了您的问题,那么您正在寻找这样的 xpath 表达式:

//ns1:agent[@ns2:about=//ns3:person/@ns2:id]/ns2:name

为了测试它,我会将示例 xml 中的ns3:persons节点从

<ns3:person ns2:id="a1"/>
<ns3:person ns2:id="a2"/>
<ns3:person ns2:id="a3"/>

<ns3:person ns2:id="a7"/>
<ns3:person ns2:id="a2"/>
<ns3:person ns2:id="a9"/>

这样只有一个随机ns1:agent对应于一个随机ns3:person.如果这样做,该 xpath 表达式将选择Mike作为目标名称。

假设您已经正确声明了命名空间前缀ns1ns2ns3,这个 XPath,

//ns3:person[@ns2:id = "a1"]/preceding-sibling::ns1:agent[1]/ns2:name

将选择紧接在已识别人员前面的代理名称。

如果需要有关声明 XML 命名空间前缀的帮助,请参阅 XPath 如何处理 XML 命名空间?


根据OP的评论进行更新:

在我的原始 xml 文档中,代理节点并不紧靠人员节点。我将为每个人员节点循环运行表达式。很抱歉造成混乱,我已经编辑了示例和问题,以便更清楚地了解我需要什么。

在编辑的问题中:

编辑:XPath 表达式将循环使用,用于每个 ns3:person 节点,所以我事先不知道具体的 id 属性值。

因此,在您的循环中,只需将一个变量(例如$id(绑定到当前ns3:person/@n2:id,然后在 XPath 中对其进行测试:

//ns1:agent[@ns2:about = $id]/ns2:name

另请参阅如何将变量参数传递到 XPath 表达式中?

最新更新