0

I have following 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>

Using the XPath expression

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

I have the result 2 3 (which is exactly what I want), but when I run

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

the result breaks at the first result:

sentence 2 - chap  1
4

1 回答 1

1

最后一个参数不包含单个值,而是一个序列。您不能使用 XPath 1.0 将此序列连接到单个字符串。如果您能够使用 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和父级(章节)@id使用 DOM 并构造结果。

于 2013-11-13T12:02:21.323 回答