我有以下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
答案 0 :(得分: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')]
查找句子节点,循环遍历它们,然后使用DOM查询@id
和父(章节)@id
并构造结果。