【问题标题】:XPath to get siblings based on base-sibling valueXPath 根据基本同级值获取同级
【发布时间】: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?

【问题讨论】:

    标签: xml xpath


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多