0

鉴于:

<?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来实现这一点。尝试了各种函数和谓词,但未能获得如上所示的输出。本质上,阅读后我应该能够分辨出哪个“测试”属于哪个报告 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。

4

2 回答 2

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, "=", .)
于 2013-03-25T13:54:05.367 回答
0

您可以通过使主要的“迭代元素”成为最深的孩子来非常优雅地做到这一点——在这个例子中,XML 根元素是 TABLE。看看我们如何“迭代”更深的称为 COLUMN 的孩子。我们取 COLUMN 的 @name(第二个),并添加 parent's-parent 的 @name 属性

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

这消除了为父级的@name 使用变量的需要

于 2017-04-07T14:33:12.347 回答