如何在不使用xquery更新的情况下找到所有空字符串并将其替换为xquery中的'empty'元素。我使用xquery更新实现了这一点,但我希望不使用更新。
答案 0 :(得分:4)
在XSLT中,这种转换更容易。在XSLT 3.0中,您可以写:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="*[.='']"><empty/></xsl:template>
</xsl:transform>
这样做的原因是“on-no-match ='shallow-copy'”会导致输入树的递归处理,如果没有特定元素的显式模板规则,处理器只会复制元素然后小心翼翼地处理它的孩子。
XQuery没有内置的原语来执行此操作,但您可以通过显式写出来实现相同的功能。你需要一个递归函数:
declare function local:process($e as node()) as node() {
if ($e[self::element()])
then
if ($e='')
then <empty/>
else
element {node-name($e)} {
$e/@*,
$e/child::node()/local:process(.)
}
else (:text, comment, PI nodes:)
$e
};
local:process($in/*)