XPath查询未使用VTDNav / AutoPilot以文档顺序返回结果作为节点顺序的节点序列

问题描述 投票:1回答:1

我具有以下xml结构。

<body>
    <level recover="true">1</level>
    <span>
        <level recover="true">1.1</level>
        <span>
            <level recover="true">1.1.1</level>
        <span>
    <span>
    <level recover="true">2</level>
    <level recover="true">3</level>
<body>

xpath query: //*[@recover='true']"

结果:1、2、3、1.1、1.1.1

似乎xpath处理器按深度构建结果深度。首先处理第一个深度级别,从中检索1、2和3,然后转到第二个深度级别,并检索1.1,然后到第三个级别,并检索1.1.1

我需要按以下顺序检索结果:1,1.1,1.1.1,2,3

更新作为XML处理器,我正在使用https://vtd-xml.sourceforge.io/userGuide/4.html

VTDGen vtdGen = new VTDGen();
vtdGen.setDoc(xmlByteContent);
VTDNav vtdNav = vtdGen.getNav();

AutoPilot autoPilot = new AutoPilot(vtdNav);
autoPilot.selectXPath("//*[@recover='true']");
<dependency>
    <groupId>com.ximpleware</groupId>
    <artifactId>vtd-xml</artifactId>
    <version>2.13</version>
</dependency>

谢谢你。

xslt xpath xml-parsing
1个回答
2
投票

有趣。在XPath 2.0中,此表达式定义为按文档顺序返回节点序列,这是您要查找的顺序。在XPath 1.0中,顺序没有定义,但是我认为所有常用的XPath 1.0处理器都以文档顺序返回结果,因为这是XSLT所需要的,并且大多数XPath 1.0处理器在设计时都考虑了XSLT。看来您发现了一个例外。

知道您使用的是哪种XPath处理器将很有趣。您可能需要移动到其他位置。

您得到的结果符合XPath 1.0规范,但仍然很令人惊讶。

LATER

除了名声,我不了解VTD。据我了解,他们将性能设计为排除所有其他问题的第一目标。因此,如果规范允许他们以任何顺序返回节点,我并不感到惊讶他们会利用这一点。您必须查看VTD文档,以查看是否有任何方法可以强制结果中的文档顺序。或进行实验:看看如果在表达式中添加`| // * [@ recover ='true']'(它们可能会按文档顺序排序以有效地实现联合操作),会发生什么。

进一步更新

AutoPilot.iterate()方法声称将以文档顺序返回选定的节点。

© www.soinside.com 2019 - 2024. All rights reserved.