0

次の XML があります。

<root>
    <chp id='1'>
        <sent id='1'>hello</sent>
        <sent id='2'>world</sent>
    </chp>
    <chp id='2'>
        <sent id='1'>the</sent>
        <sent id='2'>best</sent>
        <sent id='3'>world</sent>
    </chp>
</root>

XPath 式の使用

root/chp/sent[contains(.,'world')]/@id

私は結果を持っています2 3(これはまさに私が望むものです)が、実行すると

concat('sentence ', /root/chp/sent[contains(.,'world')]/@id, ' - chap  '  ,  /root/chp/sent[contains(.,'world')]/../@id )

結果は最初の結果で壊れます:

sentence 2 - chap  1
4

1 に答える 1

1

最後の引数には、単一の値ではなく、シーケンスが含まれています。XPath 1.0 を使用して、このシーケンスを 1 つの文字列に結合することはできません。XPath 2.0 を使用できる場合は、次を使用しますstring-join($sequence, $divisor)

concat(
  'sentence ',
  string-join(/root/chp/sent[contains(.,'world')]/@id, ' '),
  ' - chap  ',
  string-join(/root/chp/sent[contains(.,'world')]/../@id, ' ')
)

戻ります

sentence 2 3 - chap  1 2

ほとんどの場合、結果セットを自分でループしたいでしょう (XPath 2.0 も必要です):

for $sentence in /root/chp/sent[contains(.,'world')]
return concat('sentence ', $sentence/@id, ' - chap ', $sentence/../@id)

戻ります

sentence 2 - chap 1
sentence 3 - chap 2

XPath 2.0を使用できないが、DOM を使用して外部プログラミング言語 (Java、PHP など) で結果をさらに処理できる場合: を使用/root/chp/sent[contains(.,'world')]して文ノードを検索し、それらをループしてから、@id親 (第) @idDOM を使用して結果を構築します。

于 2013-11-13T12:02:21.323 に答える