如何使用concat函数加入两个XPath表达式的结果?

时间:2013-11-13 10:00:34

标签: xpath

我有以下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

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并构造结果。