XQuery:返回元素的值而不是元素本身

kpo*_*zin 24 xml xquery

我有一个包含以下内容的XML文档

...
<foo>abc</foo>
...
Run Code Online (Sandbox Code Playgroud)

如果我评估

return $xml//foo
Run Code Online (Sandbox Code Playgroud)

我回来了

<foo>abc</foo>
Run Code Online (Sandbox Code Playgroud)

有没有办法改变abc呢?

Har*_*d L 30

是的,您需要text()函数来选择子文本:

return $xml/text()
Run Code Online (Sandbox Code Playgroud)

如果你在$ xml中有嵌套的标记结构,要小心,因为这只会对文本节点有一个深度.如果你想把所有的文本节点放在一起,去掉其他的XML结构,这将是任意深入的:

return $xml//text()
Run Code Online (Sandbox Code Playgroud)

  • text()不是函数.这是一个节点测试.在你疯狂的文本()之前,请参阅Evan Lenz的帖子["text()是一个代码味道"](http://developer.marklogic.com/blog/text-is-a-code-smell),以及在奥利弗的回答和帕维尔的回答之后,我与Dave Cassel的帖子联系在一起. (4认同)

Oli*_*lam 17

使用字符串函数获取节点的字符串内容.

return string($xml)
Run Code Online (Sandbox Code Playgroud)

  • 确实.请参阅David Cassel对[text(),fn:string()和fn:data()]之间差异的解释(http://blog.davidcassel.net/2011/06/text-fnstring-and-fndata/) - 到目前为止,所有这三个都出现在三个答案中. (3认同)
  • 实际上,这比上面的首选答案更具惯用性和更好的选择.它还将正确处理子节点的任何嵌套. (2认同)

小智 8

要仅返回元素内的数据,您可以使用:

return data($xml)
Run Code Online (Sandbox Code Playgroud)