首页 文章

XPath 2.0 - 1.0等效?

提问于
浏览
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>

我想获取 element 节点的 value 属性,其中祖父母 container 节点的属性 id 等于1或3.此外,我想将上述id属性连接到相应的 element 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 tester运行此操作会导致以下错误:

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

这让我很困惑,因为在XPath 1.0 specification中存在concat .

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

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

这给出了这样的结果集:

1
0
3
1

我可以解析有问题以达到预期的格式,但我不确定联盟是否会正确配对相应的 idvalue . 有人能指出我正确的方向吗?

2 回答

  • 3

    你不能在普通的XPath 1.0中做到这一点 . 没有办法做任何类型的显式循环,让它成为XPath 2.0的简化FLWOR表达式或将函数应用为轴步骤 .

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

  • 3

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

相关问题