【问题标题】:Get all preceding and following siblings for a given node获取给定节点的所有前面和后面的兄弟姐妹
【发布时间】:2023-03-17 09:55:01
【问题描述】:

我有以下 XML sn-p:

<root>
    <CharacteristicUse>
        <UseArea>Specification_Characteristics</UseArea>
        <Value>
            <ValueID>123</ValueID>
        </Value>
        <Value>
            <ValueID>444</ValueID>
        </Value>
        <Value>
            <ValueID>555</ValueID>
        </Value>
        <Value>
            <ValueID>777</ValueID>
        </Value>
        <Value>
            <ValueID>888</ValueID>
        </Value>
    </CharacteristicUse>
</root>

我希望能够获取具有其子节点 ValueID 且文本 = 555 的 Value 节点的所有前后兄弟节点

我一直在尝试结合以下方式:

/root/CharacteristicUse/Value[ValueID='555']/following-sibling::* | preceding-sibling::*

但是,它只返回给我以下兄弟姐妹。 是否可以有一个查询来获得输出:

<Value>
   <ValueID>123</ValueID>
</Value>
<Value>
   <ValueID>444</ValueID>
</Value>
<Value>
   <ValueID>777</ValueID>
</Value>
<Value>
<ValueID>888</ValueID>
</Value>

【问题讨论】:

    标签: xpath


    【解决方案1】:

    一种方法是蛮力:

    /root/CharacteristicUse/Value[ValueID='555']/preceding-sibling::* | /root/CharacteristicUse/Value[ValueID='555']/following-sibling::*
    

    这也包括“UseArea”节点,不确定你是否想要。

    或者如果你想要的只是所有不是特定值的值,那么

    /root/CharacteristicUse/Value[not(ValueID='555')]
    

    更直接。

    【讨论】:

    • 您好,您的回答很完美。我不想要“UseArea”的第二个。但是,我通过实际的 XML 实现了多个带有多个 value/valueid 子元素的“CharacteristicUse”元素。如果我使用上面的解决方案,它甚至会从其他“CharacteristicUse”节点返回所有兄弟姐妹。但我只想从当前节点中选择一个值为 555 的节点。有什么建议么?无论如何,我将此标记为答案。 :)
    • @user2957476:您可能还想看看stackoverflow.com/questions/19740753/…
    • @Marcus:谢谢你的参考文章。非常有用。
    【解决方案2】:

    我找到了答案。 xpath 看起来像:

    /root/CharacteristicUse/Value[ValueID='555']/following-sibling::Value | /root/CharacteristicUse/Value[ValueID='555']/preceding-sibling::Value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多