【问题标题】:Use XPath expression to find always the last element of a hierarchy of similar element names使用 XPath 表达式始终查找相似元素名称层次结构的最后一个元素
【发布时间】:2019-12-09 11:13:41
【问题描述】:

我有以下 XML 结构

<?xml version = "1.0" encoding = "UTF-8"?>
<ROOT>
    <PGR name="Group1">
        <PGR name="SubGroup1.1">
            <PGR name="SubGroup1.2">
                <PRODUCT></PRODUCT>
            </PGR>
        </PGR>
    </PGR>
    <PGR name="Group2">
        <PGR name="SubGroup2.1">
            <PGR name="SubGroup2.2">
                <PGR name="SubGroup2.3">
                    <PRODUCT></PRODUCT>
                </PGR>
            </PGR>
        </PGR>
    </PGR>
</ROOT>

我想要一个 XPath 表达式,它返回名为 SubGroup1.2SubGroup2.3 的 PGR 元素。

因此我写了我在另一个 SO 中找到的以下表达式

evalExpression = "//PGR[count(*)=0]";

这确实适用于第一个 PGR 层次结构,但不适用于第二个。因此,结果集的大小仅为1

有人能给我一个例子吗?

预期结果

一组2,包含PGR name="SubGroup1.2 & PGR name="SubGroup2.3

【问题讨论】:

  • 您选择目标元素的测试是由元素的名称、它们在树中的位置还是由其他因素决定的?
  • 姓名和职位
  • 姓名部分我了解,但您能更具体地介绍一下职位吗?相对于树中的位置到底是什么位置?元素是否必须同时满足两个条件 - name=x 和 position=y,还是其中之一就足够了?
  • 它应该是最后一个PGR,没有任何后续PGR元素作为子元素。

标签: java xml xpath


【解决方案1】:

您可以做的一件事是添加一个直接PRODUCT 孩子的检查

//PGR[./PRODUCT]

或者,PGR 节点没有 PGR 节点作为子节点:

//PGR[not(PGR)]

计算child::* 的问题是child 轴只考虑直接子级。您可以切换到descendant axis 来检查所有孩子、孙子、孙子等,并且只需要 1 个:

//PGR[count(descendant::*) = 1]

【讨论】:

  • 后者有效。你能解释一下如何“阅读”这个表达吗? [ ] 是指子元素吗?如果是的话 - child 轴可以实现同样的效果吗?
  • @xetra11 当然,[] 只是过滤器的语法。 child 轴的问题在于它计算节点的直接子节点并且不会更深入。但是,请注意,descendants 应该在这里工作://PGR[count(descendant::*) = 1]。添加到答案。谢谢。
  • 我对@9​​87654335@ 还是有点困惑。拥有//PGR[not(PGR)] 对我来说是“如果 PGR 不是 PGR”——这对我来说没有意义。 [not(PGR)] 如何应用于下一个嵌套元素?
  • @xetra11 啊,我想我明白什么让你困惑了。 not(PGR)not(./PGR) 相同 - 所以对于 //PGR[not(PGR)],我们正在寻找没有任何其他 PGR 节点作为子节点的 PGR 节点。希望这更清楚一点。
  • 好的,因为. 指的是当前节点,./PGR 因此指的是树中的下一个节点(unix 样式),现在它是有意义的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2013-01-21
  • 2021-07-29
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多