XPath 根据基本同级值获取同级

Posted

技术标签:

【中文标题】XPath 根据基本同级值获取同级【英文标题】:XPath to get siblings based on base-sibling value 【发布时间】:2022-01-03 14:06:33 【问题描述】:

我正在尝试构建一个 XPath 表达式以根据基本兄弟的数据来查找兄弟。

示例 XML:

<data>
    <meta>
        <material>123456</material>
        <type>a</type>
    </meta>
    <meta>
        <material>456789</material>
        <type>b</type>
    </meta>

    <dataobj0>
        <material>123456</material>
        <somedata>Test0</somedata>
    </dataobj0>
    <dataobj0>
        <material>456789</material>
        <somedata>Test1</somedata>
    </dataobj0>
    
    <dataobj1>
        <material>123456</material>
        <somedata>Test2</somedata>
    </dataobj1>
    <dataobj1>
        <material>456789</material>
        <somedata>Test3</somedata>
    </dataobj1>
</data>

我遍历所有&lt;meta&gt; 元素,对于每个元元素,我想找到匹配的dataobj0 和dataobj1。所以当我在&lt;meta&gt;&lt;material&gt;123456&lt;/material&gt;&lt;/meta&gt;时,我想访问/data/dataobj0[material = "123456"]/data/dataobj1[material = "123456"]

我虽然是这样的: ../dataobj0[material = ./material]following-sibling::dataobj0[material = ./material] 可以工作,但在这种情况下,./material 已经有兄弟姐妹的号码。

任何想法,我怎样才能在这里获得当前元元素的materialnumber?

【问题讨论】:

【参考方案1】:

例如要获取第二个&lt;meta&gt;(带有&lt;type&gt;b&lt;/type&gt;的那个)对应的dataobj,使用

//*[starts-with(name(),"dataobj")][material=(//meta/material)[2]]/somedata

如果您使用的是 xpath>1.0,您可以像这样配对它们:

//*[starts-with(name(),"dataobj")][material=(//meta/material)[2]]/(somedata/text() | //meta[.//material=material][2]//type/text())

并得到这个输出:

b
Test1
Test3

【讨论】:

以上是关于XPath 根据基本同级值获取同级的主要内容,如果未能解决你的问题,请参考以下文章

如何根据同级别的另一个值获取 JSON 数据值?

xpath获取同级节点

XSL 根据 Element 值删除所有前面的同级

根据以下同级词排序-XSLT

如果通过当前元素知道父元素同级元素

如果通过当前元素知道父元素同级元素