1

我正在尝试构建一个将其属性“反转”为子元素并将子元素“反转”为属性的单个节点。为此,我需要一个遍历每个属性的 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>

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

非常感谢堆栈:)

4

1 回答 1

1

所以答案很简单,我最初在错误的地方尝试了它的变体。那好吧。这里是:

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

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

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

于 2018-03-28T10:20:34.533 回答