在元素结构XQuery中不能有几个for循环

时间:2018-03-28 09:25:53

标签: xquery flwor

我正在尝试构建一个单独的节点,将其属性“反转”为子元素,将子元素“反转”为属性。为此,我需要一个遍历每个属性的for循环,并迅速将其转换为具有正确名称和正确值的节点,反之亦然。这很好,花花公子,但可以理解的是这段代码不能编译。

for $subele in //music/*
return
<doc>
{
  element {node-name($subele)} 
    {
    for $deepernode in $subele/* (: first for loop :)
    return 
    attribute {node-name($deepernode)} {concat("_",replace(lower-case($deepernode),"[^A-Za-z_0-9]","_"))}
    for $deepernode in $subele/@* (: second for loop :)
    return 
    element {node-name($deepernode)} {concat("_",replace(lower-case($deepernode),"[^A-Za-z_0-9]","_"))}

    }
 }
</doc>

没有其他方法可以做到这一点,或者我是否需要首先构造属性反转,然后用元素“修改”,反之亦然?

非常感谢Stack:)

1 个答案:

答案 0 :(得分:1)

所以答案非常简单,我最初在错误的地方试过它的变种。那好吧。这是:

  (for $deepernode in $subele/*
  return 
  attribute {node-name($deepernode)} {$deepernode/string()}),   
  (for $deepernode in $subele/@*
  return 
  element {node-name($deepernode)} {$deepernode/string()})

将for循环放入一个序列,可以说,将它们放在paranthesis中并在它们之间写','。就是这样。

PS:所有的concat / replace东西都是不必要的。