XPath选择所有内容直到第一个

时间:2015-07-27 13:39:56

标签: xml xpath

我有这个XML:

<test>
  <a>
    abc
    <xyz />
    def
    <br />
    ghi jkl
    <br />
    mno pqr
  </a>
  <a>
    xxx
  </a>
</test>

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

abc
<xyz />
def

xxx

我可以在<br />&#34;之前选择所有内容。像这样:

//a/*[following::br]

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

//a/*[following::br[1]]

...与之前的结果相同。这些也不会选择&#34;非<br />&#34;中的节点。 <a>秒。

如何使用(可单一的)XPath表达式执行此操作?感谢您的任何建议。

1 个答案:

答案 0 :(得分:6)

您可以尝试这种方式(格式化以便于阅读):

//a/node()[
    following-sibling::br[not(preceding-sibling::br)] 
        or 
    not(../br)
]

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

  • following-sibling::br[not(preceding-sibling::br)]:当第一个true 之前的相应节点表示为&#34;时,评估为<br/>没有前任兄弟<br>&#34; -

  • <br/>
  • not(../br):当父true没有任何孩子<a>

  • 时评估为<br/>