XPath在一个查询中连接父属子值和子属性值

时间:2013-03-25 10:25:04

标签: xml xpath xpathnavigator

假设:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<report Id="0" >
<property name="comments">comment</property>
<property name="test">sdcs</property>
<property name="test">csd</property>
<property name="eventHandlerClass">sdcs</property>
</report>
<report  Id="1">
<property name="comments">comment</property>
<property name="test">dcs</property>
<property name="test">gds</property>
<property name="test">jds</property>
<property name="eventHandlerClass">sdcs</property>
</report>
</root>

预期产出:

Id=0, test=sdcs
Id=0, test=csd
Id=1, test=dcs
Id=1, test=gds
Id=1, test=jds

仅查找纯Xpath 1.0 才能实现此目的。尝试了varioud函数和谓词,但未能得到如上所述的输出。 基本上,在阅读后我应该能够告诉哪个“测试”属于哪个报告ID。

尝试:

/root/report/@Id | /root/report/property[@name="test"] - 但结果是单独的行

/root/report/ ( @Id | property[@name="test"]) - 但结果是单独的行

concat( /root/report/@Id, /root/report/property[@name="test"]) - 给出错误(认为Concat适用于单行结果)

string-join(/root/report/@Id | /root/report/property[@name="test"] , ',') - 所有内容都是单行,甚至是两个报告ID。

2 个答案:

答案 0 :(得分:1)

您可以使用for来将id保存在变量中:

for $report in /root/report 
return for $property in $report/property[@name="test"]
return concat("Id=", $report/@Id, ", ", $property/@name, "=", $property)

或更短:

for $report in /root/report return
$report/property[@name="test"]/
concat("Id=", $report/@Id, ", ", @name, "=", .)

答案 1 :(得分:0)

通过使主要的“迭代元素”成为最深的子元素,您可以非常优雅地完成此操作 - 在此示例中,XML根元素是TABLE。看看我们如何“迭代”一个叫做COLUMN的更深层的孩子。我们取COLUMN的@name(第二个),并添加父母的@name属性

/TABLE/COLUMNS/COLUMN/concat(../../@name, ' : ', @name)

这消除了为父亲的@name

使用变量的需要