将树转换为元素序列

时间:2013-12-22 12:49:09

标签: xquery

我有类似的东西

<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;),但如果删除元素构造函数,则根本不会输出。

1 个答案:

答案 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() }