Xpath 选择“text()”,1)位于给定节点之前,但2)也是另一个给定节点的后代

Xpath 选择“text()”,1)位于给定节点之前,但2)也是另一个给定节点的后代,xpath,Xpath,这是的后续问题,但不幸的是,该问题的答案不适用 假设我有以下XML: <body> <div id="global-header"> header </div> <div id="a"> <h3>some title</h3> <p>text 1 <b

这是的后续问题,但不幸的是,该问题的答案不适用

假设我有以下XML:

<body>
    <div id="global-header">
        header
    </div>

    <div id="a">
        <h3>some title</h3>
        
        <p>text 1 
            <b>bold</b>
        </p>
        
        <div>
            <p>abc</p>
            <p>text 2</p>
            <p>def</p>
        </div>
    </div>

</body>

警告是

  • 前面的节点可以包含任意节点类型,不仅是
  • text 2

    节点可以任意地嵌入树中的深处,因此类似xpath的
    //p[text()=“text 2”]/前面的兄弟节点::*
    只提取
    abc

    ,而忽略其他节点

  • 您可以尝试以下XPath表达式:

    //p[.='text 2']/preceding::text()[ancestor::div[@id='a']]
    
    这种方法的缺点是,
    text()
    节点可能没有明确分开,而是为子元素合并。要分离它们,需要某种for循环

    //p[.='text 2']/preceding::text()[ancestor::div[@id='a']]