我有类似的东西
<a>
<b>
<c>1</c>
<d>2<e>3</e></d>
</b>
</a>
我希望获得这样的序列
<a/>
<b/>
<c>1</c>
<d>2<e>3</e></d>
也就是说,在递归时,每次出现一个没有文本节点的元素时,我想将该元素作为空元素输出,而每次出现带有文本节点的元素时,我想将其输出为它是。当然,上述输入中的文本节点必须进行空间规范化。
如果我通过标准身份转换,
declare function local:copy($element as element()) as element() {
element {node-name($element)}
{$element/@*,
for $child in $element/*
return
if ($child/text())
then $child
else (element {node-name($child)}{$child/@*}, local:copy($child))
}
};
&LT b取代;重建为完整元素(包含&lt; c&gt;和&lt; d&gt;),但如果删除元素构造函数,则根本不会输出。
答案 0 :(得分:1)
我在你的示例输出中没有得到第四行,我只是猜测你想要的实际上是这样:
<a/>
<b/>
<c>1</c>
<d>2</d>
<e>3</e>
您不需要任何功能。只需列出所有元素,重建一个具有相同名称的元素,并将其包含在文本节点子节点中。
for $element in //*
return element { local-name($element) } { $element/text() }
这个版本更短,但我认为它需要XQuery 3.0,因为早期版本不允许步骤表达式中的元素构造函数:
//*/element { local-name(.) } { text() }