2016-04-08 9 views
-1

Ich habe eine Liste von Strings mit Informationen darüber, wie tief sie in einer XML-Struktur sind. Die Zeichenfolgen an "der Unterseite", d. H. Diejenigen Elemente, die vor einem Element mit einer niedrigeren Tiefe auftreten, enthalten Text.Umwandlung der Sequenz von STRING in Baum

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

Ich möchte dies als die XML-Struktur unter wiederherzustellen, in einem Arbeitsgang.

<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> 

Antwort

0

Ich verstehe nicht, warum in Ihrem Beispiel das vorletzte b_Text nicht in einer g2-Gruppe ist, und ich verstehe nicht, warum die endgültige e_text außerhalb einer Gruppe. Allerdings ist die folgende Abfrage:

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) 

erzeugt das Ergebnis

<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> 

das ist die nächste, die ich für das Verständnis Ihrer Anforderung zu erhalten.

+0

Danke! Ich werde dir sicher für deine Veröffentlichung danken! –

+0

Ich habe einen Fehler gemacht, wenn ich das Beispiel kopiert.Result xml endet Text ist außerhalb von Gruppen und b_text kann in anderen Gruppen sein. –

Verwandte Themen