假设:
<?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。
答案 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
使用变量的需要