我有一个字符串列表,其中包含有关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>
答案 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>
这是我能够理解你的要求的最接近的。