2016-04-08 15 views
-1

XML ağacında ne kadar derin olduklarına dair bilgi içeren bir dizeler listemiz var. "Altta" olan diziler, yani daha düşük bir derinliğe sahip bir elemandan önce meydana gelen elemanlar metin içerir.STRING değerinin ağaçlandırma sırası ağaç

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

Bir operasyonda, Aşağıdaki XML ağacı olarak bu sulandırmak istiyorum. sizin örnekte sondan bir önceki b_text bir g2 grubunda olmamasının sebebi

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

cevap

0

anlamıyorum ve nihai e_text herhangi grubun dışında neden anlamıyorum. Ancak, aşağıdaki sorgu:

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) 

sonucu senin gereksinimi anlama alabilirsiniz yakın olan

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

üretir.

+0

Teşekkürler! Gönderiminiz için size kredi vereceğinden emin olacağım! –

+0

Örnek kopyaladığımda bir hata yaptım.Result xml, metninin metinlerinin dışındadır ve b_text diğer gruplarda olabilir. –