在xquery中包装子节点内容

时间:2014-08-05 21:51:17

标签: xquery

我希望这是一个非常简单的问题,但我是xquery的新手而且我无法完成这项工作:

我有以下一点xml:

<collation>1<num>12</num> 2<num>12</num> ||
                    I<num>8</num>-V<num>8</num>, 1 flyleaf</collation>

我需要进行转换,以便成为新节点的内容,如下所示:

<note displayLabel="Collation: Notes">1(12) 2(12) || I(8)-V(8), 1 flyleaf<note>

我使用以下xquery代码尝试执行此操作:

<note displayLabel="Collation:Notes">{for $t in doc("collation.xml")//collation,
$h in distinct-values($t)  
return
????
</note>

问题是我可以使用数据($ t)显示所有内容(所以没有括号),或者我可以使用数据显示我想要在括号中的内容(标签中的信息) ($ t / num)但是我无法弄清楚如何用括在括号中的标签中的项目来显示它们。我确定这是一个非常简单的答案,但我无法找到它。

1 个答案:

答案 0 :(得分:1)

这对于递归是一个很好的工作:

declare function local:render(
  $n as node()
) as node()?
{
  typeswitch($n)
    case element(num) return text{concat('(', $n, ')')}
    case element(collation) return 
      <note displayLabel="Collation: Notes">{
        for $n in $n/node()
      return local:render($n)
      }</note>
    case element() return element { node-name($n) } {
      for $n in $n/node()
      return local:render($n)
    }
    default return $n
};

local:render(
<collation>1<num>12</num> 2<num>12</num> || I<num>8</num>-V<num>8</num>, 1 flyleaf</collation>)

=>

<note displayLabel="Collation: Notes">1(12) 2(12) || I(8)-V(8), 1 flyleaf</note>