将STRING序列转换为树

时间:2016-04-08 20:59:15

标签: xpath xquery sequence

我有一个字符串列表,其中包含有关XML树中它们的深度的信息。字符串位于"底部,"即那些在深度较低的元素之前出现的元素包含文本。

a_text,b_text,c_text,g1_text,b_text,c_text,g2_text,b_text,g1_text,g2_text,b_text,e_text

我想在一次操作中将其重构为下面的XML树。

<AA>
<a>text</a>
<b>text</b>
<c>text</c>
<g1_1>
    <g1>text</g1>
    <b>text</b>
    <c>text</c>
    <g2_2>
        <g2>text</g2>
        <b>text</b>
    </g2_2>
</g1_1>
<g1_1>
    <g1>text</g1>
    <b>text</b>
</g1_1>
<e>text</e></AA>

1 个答案:

答案 0 :(得分:0)

我不明白为什么在你的例子中倒数第二个b_text不在g2组中,我不明白为什么最终的e_text在任何组之外。但是,以下查询:

declare function local:grouping($seq as element()*, $level as xs:integer) as element()* {
    for tumbling window $w in $seq
    start $s at $p when $p eq 1 or matches(name($s), "^g"||$level)
    return if (matches(name($s), "^g"||$level)) 
           then element {name($s)||"_"||$level} {local:grouping($w, $level+1)}
           else $w
};

let $seq := 
    let $in := "a_text,b_text,c_text,g1_text,b_text,c_text,g2_text,b_text,g1_text,g2_text,b_text,e_text"
    for $t in tokenize($in, ",")
    return element {substring-before($t, "_")} {substring-after($t, "_")}
return local:grouping($seq, 1)

生成结果

<a>text</a>
<b>text</b>
<c>text</c>
<g1_1>
   <g1>text</g1>
   <b>text</b>
   <c>text</c>
   <g2_2>
      <g2>text</g2>
      <b>text</b>
   </g2_2>
</g1_1>
<g1_1>
   <g1>text</g1>
   <g2_2>
      <g2>text</g2>
      <b>text</b>
      <e>text</e>
   </g2_2>
</g1_1>

这是我能够理解你的要求的最接近的。