XPath首先选择所有内容<br />

Rom*_*cke 4 xml xpath

我有这个XML:

<test>
  <a>
    abc
    <xyz />
    def
    <br />
    ghi jkl
    <br />
    mno pqr
  </a>
  <a>
    xxx
  </a>
</test>
Run Code Online (Sandbox Code Playgroud)

在每个<a>我需要选择所有子节点(甚至文本),直到第一个<br />.如果没有<br />,我需要选择给定的所有子节点<a>.所以预期的结果是:

abc
<xyz />
def
Run Code Online (Sandbox Code Playgroud)

xxx
Run Code Online (Sandbox Code Playgroud)

我可以<br />像这样选择"之前的一切":

//a/*[following::br]
Run Code Online (Sandbox Code Playgroud)

...但它会在最后一个 之前选择所有内容<br />.我需要在一个之前选择所有内容.我试过这样的:

//a/*[following::br[1]]
Run Code Online (Sandbox Code Playgroud)

......与以前的结果相同.这些也不选择"非<br />"中<a>的节点.

我怎样才能使用(可单一的)XPath表达式?谢谢你的任何建议.

har*_*r07 7

您可以尝试这种方式(格式化为可读性):

//a/node()[
    following-sibling::br[not(preceding-sibling::br)] 
        or 
    not(../br)
]
Run Code Online (Sandbox Code Playgroud)

关于[]正在使用的谓词表达式(内容)的简要说明:

  • following-sibling::br[not(preceding-sibling::br)]:评估true第一个表示<br/>" <br>没有前一个兄弟<br/>"之前的相应节点时-

  • not(../br):评估true父母<a>没有任何孩子的时间<br/>

  • @RomanHocke正在研究解释,检查出来 (3认同)