2

我无法生成有效的 XPath 1.0 等效于一个工作 2.0 示例,它会产生相同的结果(事实上,不会失败)。我必须使用以前版本的原因是 PHP 不支持 XPath 2.0。

我的 xml 看起来像:

<root>
    <container id="1">
        <elements>
            <element value="0"/>
        </elements>
    </container>
    <container id="2">
        <elements>
            <element value="1"/>
        </elements>
    </container>
    <container id="3">
        <elements>
            <element value="1"/>
        </elements>
    </container>
</root>

我想获取节点的value属性element,其中祖父container节点的属性id等于 1 或 3。我还想获取与相应属性连接的上述 idelement value属性。如果前两个语句不完全可读(这些天我的英语有点生疏),这就是我想要实现的目标:

1:0
3:1

格式为:

[container id]:[element value]

我编写的工作 XPath 2.0 路径给出了预期的结果:

//container[@id=1 or @id=3]//element/concat(../../@id, ":", @value)

但是,使用XPath 1.0 测试器运行它会导致以下错误:

ERROR - Failed to evaluate XPath expression: Unknown nodetype: concat

这让我感到困惑,因为 concat 存在于XPath 1.0 规范中。

我尝试使用不同的方法,例如使用这样的路径:

//container[@id=1 or @id=3]/@id | //container[@id=1 or @id=3]//element/@value

这给出了这样的结果集:

1
0
3
1

我可以有问题地解析它以实现预期的格式,但我不确定联合是否会正确配对相应idvalue。谁能指出我正确的方向?

4

2 回答 2

3

您不能在纯 XPath 1.0 中执行此操作。没有办法做任何类型的显式循环,让它成为 XPath 2.0 的简化 FLWOR 表达式或将函数应用为轴步骤。

在 XPath 中获取容器,并在 XPath 之外进行进一步处理,或者嵌入 XPath 2.0(或 XQuery,它是一个超集)处理器。

于 2014-02-21T18:09:50.723 回答
3

XPath 2.0 表达式的结果是一个字符串序列。这是一种在 XPath 1.0 中甚至不存在的数据类型。所以你基本上必须用宿主语言做更多的工作。

于 2014-02-21T18:19:02.783 回答