2016-07-10 11 views
2

Ich muss Knoten mit unterschiedlichen Namen Attributwerte unter Berücksichtigung nur des ersten Zeichens auswählen.XQuery - Wählen Sie Knoten mit unterschiedlichen Teilstring des Attributs

Die XML ist

<A> 
    <B name="X_01"/> 
    <B name="X_02"/> 
    <B name="Y_01"/> 
    <B name="X_03"/> 
    <B name="Z_01"/> 
    <B name="Y_02"/> 
</A> 

Wunsch Ausgang

<B name="X_01"/> 
<B name="Y_01"/> 
<B name="Z_01"/> 

Es ist nicht das erste Vorkommen von B mit dem deutlichen ersten Zeichenwert im Namensattribut sein muss.

Ich bin neu in XQuery und war nicht in der Lage, eine Arbeitsanweisung zu erstellen.

Danke für Ihre Hilfe

Antwort

2
xquery version "1.0"; 

let $xml := <A> 
<B name="X_01"/> 
<B name="X_02"/> 
<B name="Y_01"/> 
<B name="X_03"/> 
<B name="Z_01"/> 
<B name="Y_02"/> 
</A> 

let $distinct-values := fn:distinct-values(
    for $attr in $xml/B/@name 
    return fn:substring($attr,1,1) 
) 

return for $prefix in $distinct-values 
    return $xml/B[fn:starts-with(@name, $prefix)][1] 
+0

Danke. Funktioniert gut. – user3525398

+0

Keine Sorge. Denken Sie daran, dass der erste Teil nicht wirklich der größte Skalierungsfaktor ist, aber dies ist sicherlich ein Ansatz, den ich verwenden würde, wenn ich die Einschränkungen kenne. Aus Gründen der Vernunft, ich habe gerade einen Test von 100000 ersten XML-Elementen mit einer Möglichkeit von 1000 Präfixe und immer noch eine Untersekundenantwort –

+0

Ok für meine Zwecke. Durchschnittlich wahrscheinlich um 200 Elemente. – user3525398

1

Etwas einfachere Implementierung der Gruppe durch Klausel thusly:

let $stuff := <A> 
    <B name="X_01"/> 
    <B name="X_02"/> 
    <B name="Y_01"/> 
    <B name="X_03"/> 
    <B name="Z_01"/> 
    <B name="Y_02"/> 
</A> 
return 
    for $b in $stuff/B 
    group by $val := substring($b/@name, 1, 1) 
    return $b[1] 
Verwandte Themen