我无法生成有效的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。我想将上述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
我可以解析问题以达到预期的格式,但我不确定联盟是否会正确配对相应的id
和value
。有人能指出我正确的方向吗?
答案 0 :(得分:3)
你不能在普通的XPath 1.0中这样做。没有办法做任何类型的显式循环,让它成为XPath 2.0的简化FLWOR表达式或将函数应用为轴步骤。
在XPath中获取容器,在XPath外部进行进一步处理,或者嵌入XPath 2.0(或XQuery,它是超集)处理器。
答案 1 :(得分:3)
XPath 2.0表达式的结果是一系列字符串。这是XPath 1.0中甚至不存在的数据类型。所以你基本上必须用宿主语言做更多的工作。