【问题标题】:XQuery: Return value of an element rather the element itselfXQuery:返回元素的值而不是元素本身
【发布时间】:2010-11-12 10:02:53
【问题描述】:

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

...
<foo>abc</foo>
...

如果我评估

return $xml//foo

我回来了

<foo>abc</foo>

有什么方法可以只获取abc 吗?

【问题讨论】:

    标签: xml xquery


    【解决方案1】:

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

    return $xml/text()
    

    如果您将在 $xml 中包含嵌套标记结构,请小心,因为这对于文本节点只会深入一层。如果你想把所有的文本节点放在一起,去掉其他的 XML 结构,这将做任意深度:

    return $xml//text()
    

    【讨论】:

    • text() 不是函数。这是一个节点测试。在你把 text() 发疯之前,请参阅 Evan Lenz 的帖子 "text() is a code smell",以及我在 Oliver 的回答和 Pavel 的回复后链接到的 Dave Cassel 帖子。
    【解决方案2】:

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

    return string($xml)
    

    【讨论】:

    • 这实际上是比上面的首选答案更惯用和更好的选择。它还将正确处理任何子节点的嵌套。
    • 确实如此。请参阅 David Cassel 对 differences between text(), fn:string(), and fn:data() 的解释——到目前为止,这三个答案都出现在三个答案中。
    【解决方案3】:

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

    return data($xml)
    

    【讨论】:

    • 更准确地说,fn:data() 是一个函数,它为您提供节点序列的原子化值,即每个节点的类型值;而 fn:string() 为您提供节点的字符串值。有关 text()、fn:string() 和 fn:data() 之间差异的更多信息,请参阅上面的 cmets 链接。
    【解决方案4】:

    转换为 xs:string {xs:string($xml/foo)}

    【讨论】:

      【解决方案5】:

      OSB(oracle service bus)用户可以使用以下功能。

      fn-bea:serialize($xml)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多