代码之家  ›  专栏  ›  技术社区  ›  Fravadona

如何在结束标记之前选择文本节点,但仅当有一个时

  •  1
  • Fravadona  · 技术社区  · 2 月前

    我想提取位于结束标签之前的文本节点 a 元素。例如,使用此示例XML:

    <root>
      <a/>
      <a>1</a>
      <a>2<b/>3</a>
      <a>4<b/></a>
      <a><b/>5<c/></a>
    </root>
    

    预期的结果将是 ( 1, 3 )

    表达 //a/text()[last()] 还不够,因为它回来了 ( 1, 3, 4, 5 ) ,问题是我看不出如何添加约束:” 就在结束标签之前 ".

    2 回复  |  直到 2 月前
        1
  •  3
  •   Jokoyoski    2 月前

    试试这个

    //a/text()[not(following-sibling::node())]
    

    它在关闭之前直接选择文本节点 </a> 标签。

    对于您的示例,它返回 1, 3 .

        2
  •  2
  •   Remy Lebeau    2 月前

    当你使用 //a/text()[last()] 您只查看每个文本节点的子文本节点 a 元素,抓住 last() 文本节点,而不考虑其与周围任何兄弟节点的关系。

    以下将逐一介绍 元素的最后一个子元素,无论其类型如何,然后仅当它实际上是一个文本节点时才返回它:

    //a/node()[last()][self::text()]

    它会回来的 1, 3 在你的例子中。