【问题标题】:Find any element whose value = X and report path to root查找 value = X 的任何元素并报告到 root 的路径
【发布时间】:2021-07-16 15:37:23
【问题描述】:

我有这样的数据:

<people>
    <person id="1">
        <july>busy</july>
    </person>
    <person id="2">
        <july>
            <Fridays>busy</Fridays>
        </july>
    </person>
    <person id="3">
        <july>
            <Fridays>
                <afternoons>busy</afternoons>
            </Fridays>
        </july>
    </person>
</people>

我想找到所有 text = 'busy' 的元素,然后将它们的路径报告回根目录。

我什至还没有找到如何打印元素。

//[text() = "busy"]

给予

[false()]
[false()]
[false()]
[true()]
[false()]
[false()]
[false()]
[true()]
[false()]
[false()]
[false()]
[false()]
[true()]
[false()]

来自 Martin Honnen 的//*[. = 'busy']!path() 非常接近!

/Q{}people[1]/Q{}person[1]
/Q{}people[1]/Q{}person[1]/Q{}july[1]
/Q{}people[1]/Q{}person[2]
/Q{}people[1]/Q{}person[2]/Q{}july[1]
/Q{}people[1]/Q{}person[2]/Q{}july[1]/Q{}Fridays[1]
/Q{}people[1]/Q{}person[3]
/Q{}people[1]/Q{}person[3]/Q{}july[1]
/Q{}people[1]/Q{}person[3]/Q{}july[1]/Q{}Fridays[1]
/Q{}people[1]/Q{}person[3]/Q{}july[1]/Q{}Fridays[1]/Q{}afternoons[1]

我想我更喜欢只显示每个人最长路径的东西?我对Q{}s 并不感兴趣,但它的优先级要低得多。

/Q{}people[1]/Q{}person[1]/Q{}july[1]
/Q{}people[1]/Q{}person[2]/Q{}july[1]/Q{}Fridays[1]
/Q{}people[1]/Q{}person[3]/Q{}july[1]/Q{}Fridays[1]/Q{}afternoons[1]

【问题讨论】:

  • 有趣,同一天的第二个人使用/[boolean expression] 而不是例如foo[boolean expression]。我想你想要//*[. = 'busy']!path()
  • 是的,这似乎是一个常见的错误。

标签: xml xpath xquery


【解决方案1】:

我从您的评论中猜想您的解析器会切掉空格,因此您需要//*[not(*) and . = 'busy']!path(),以确保您只选择叶子元素。

【讨论】:

  • 你也可以//text()[.='busy']/..!path()
  • (//*[. = 'busy']=&gt;innermost())!path() 也可以。
  • 还有一个://*[text() = 'busy'] ! path()text() 会比 . 快,因为比较只会在文本节点上执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2023-03-25
  • 2020-02-11
  • 2014-11-01
  • 2013-10-31
相关资源
最近更新 更多