【问题标题】:Xpath: First letter/string immediately following elementXpath:紧跟在元素之后的第一个字母/字符串
【发布时间】:2019-11-09 13:42:15
【问题描述】:

我有以下 XML 可能性:

<metamark/><anything>. <anything2>bla</anything2>.</anything>
<metamark/>.<anything> <anything2>bla</anything2>.</anything>
<metamark/><anything><anything2>bla</anything2>.</anything>

我想得到第一个“。”所以我尝试了:

starts-with(metamark[not(descendant::text())]/following-sibling::text()[1],'.')

上面的第 2 行工作正常,但我错过了第 1 行。所以我做了:

starts-with(metamark[not(descendant::text())]/following-sibling::text()[1],'.') or starts-with(metamark[not(descendant::text())]/following-sibling::*[1]/text()[1],'.')

现在适用于上述所有行。但是第 3 行不应该是真的,因为我只想要“。”紧随空&lt;metamark/&gt; 或紧随其后的同级的第一个字符串,但如果在“。”之前该同级的任何后代元素中存在文本,则不是。

简单来说:元素之后的第一个文本(最接近实际结束的“>”)。我将如何实现?

【问题讨论】:

    标签: xml string xpath xpath-2.0


    【解决方案1】:

    怎么样:“任何&lt;metamark&gt;之后的第一个文本节点,只要它以'.'开头”

    //metamark[not(descendant::text())]/following::text()[1][starts-with(., '.')]
    

    <r>
      <metamark/><anything>. yes1<anything2>bla</anything2>. no1</anything>
      <metamark/>. yes2<anything> <anything2>bla</anything2>. no2</anything>
      <metamark/><anything><anything2>bla</anything2>. no3</anything>
    </r>
    

    这个检索

    '. yes1'
    '. yes2'
    

    following:: 轴会忽略嵌套,这对于此任务很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多