XQuery - 删除标记但保留其文本

时间:2011-02-26 00:17:29

标签: xml text xquery strip-tags

如何在XQuery中删除一组标签但仍保留其文本?例如,如果我有:

<root>
    <childnode>This is <unwantedtag>some text</unwantedtag> that I need.</childnode>
</root>

如何删除不需要的标记以获取:

<root>
    <childnode>This is some text that I need.</childnode>
</root>

实际上,我最终想要的只是文字,例如:

This is some text that I need.

当我执行以下操作时:

let $text := /root/childnode/text()

我明白了:

This is  that I need.

它缺少some text部分。

有关如何退回This is some text that I need.的任何想法?

谢谢。

3 个答案:

答案 0 :(得分:4)

它不是您感兴趣的childnode的字符串值(与文本节点序列或简化元素相对)?您可以从fn:string获取字符串值:

string(/root/childnode)

答案 1 :(得分:2)

使用

/*/childnode//text()

在提供的XML文档上评估此XQuery时:

<root>
 <childnode>This is <unwantedtag>some text</unwantedtag> that I need.</childnode>
</root>

产生了想要的正确结果:

This is some text that I need.

答案 2 :(得分:0)

这个XQuery:

declare function local:copy($element as element()) {
   element {node-name($element)}
           {$element/@*,
            for $child in $element/node()
            return if ($child instance of element())
                   then local:match($child)
                   else $child
           }
};
declare function local:match($element as element()) {
   if ($element/self::unwantedtag)
   then for $child in $element/node()
        return if ($child instance of element())
               then local:match($child)
               else $child
   else local:copy($element)
};
local:copy(/*)

输出:

<root>
    <childnode>This is some text that I need.</childnode>
</root>