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

これを実現するには、プレーンなXpath1.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が1行の結果で機能すると考えてください)

string-join(/root/report/@Id | /root/report/property[@name="test"] , ',') --すべてが1行で表示され、2つのレポートIDも含まれます。

4

2 に答える 2

1

そのために使用して、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(2番目)を取得し、親の親の@name属性を追加します

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

これにより、親の@nameに変数を使用する必要がなくなります。

于 2017-04-07T14:33:12.347 に答える