C#.NET * C++ * JAVASCRIPT * PYTHON * XML
* XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC



XPath / XPath-Operatoren / Bang!

Bang!

Bang!

➪ In XSL 3.0 / XPath 3.0 ermöglich der Bang-Operator ! eine verkürzte Schreibweise für Schleifendurchläufe.

normal äquivalent zu
for $w in //name return string-length($w) (//name) ! string-length(.)
for $w in //Mensch return $w/vorname/text() //Mensch ! vorname/text()
for $w in (1 to 3) return 'Moin' (1 to 3) ! 'Moin'

(1 to 3) ! 'Moin'

ergibt dabei


Moin
Moin
Moin

(1 to 5)!(. || ' Holzflos')

ergibt dagegen


1 Holzflos
2 Holzflos
3 Holzflos
4 Holzflos
5 Holzflos

Das folgende Beispiel listet dreimal hintereinander die Zahlen 5 bis 9 auf.


(1 to 3)!(5 to 9)

ergibt


5
6
7
8
9
5
6
7
8
9
5
6
7
8
9

Verdoppeln Sie die Zahlen von 1 bis 3 mit


(1 to 3)!( . + .)

ergibt


2
4
6

Kehren Sie die Reihenfolge der Zahlen 8 bis 11 um () und multiplizieren Sie den jeweiligen Wert mit dessen jeweiligen Indexwert (11*1, 10*2, 9*3, 8*4):


reverse(8 to 11) ! (. * position()) 

ergibt


11
20
27
32

Dasselbe nochmal, dieses Mal Sie die Einzelwerte:


((8 to 11) => reverse()) ! (. * position()) => sum()

Das Ergebnis lautet:


90

Auch ein mehrfacher Aufruf des Bang-Operators ist möglich. Der folgende Ausdruck multiplliziert sämtliche Zahlen von 1 bis 9 mit deren Indexwert (1*1, 2*2, ..., 9*9), und verdoppelt diese anschliessend.


(1 to 9)!(. * position())!(. + .) 

ergibt daher


2
8
18
32
50
72
98
128
162

Die vorher ermittelte Zahlensequenz können Sie mittels und der -Funktion auch gleich summieren:


(1 to 9)!(. * position())!(.+ .) => sum()

ergibt


570

Auch in der Verarbeitung von Arrays bietet sich der Bang-Operator an:


declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
let $vvar := [1,3,5,7,9]
return (1 to array:size($vvar)) ! array:get(array:reverse($vvar), .)

ergibt


9
7
5
3
1

Auch der bietet sich zur Verwendung an:


random-number-generator()?permute(1 to 5) ! (. * .)

4
16
9
1
25

Der Bang!-Operator in der Verarbeitung komplexer Nodes

Statt


for $w in (//Mensch) return 
       <Saldo Einkommen="{$w/Gehalt}">{
               ($w/Gehalt - sum($w/Kauf/Gesamt))
            }</Saldo>

lautet der verkürzte Ausdruck mit dem Bang-Operator so:


(//Mensch) ! <Saldo Einkommen="{Gehalt}">{
               (Gehalt - sum(Kauf/Gesamt))
               }</Saldo>

Das Ergebnis sieht etwa so aus:


<Saldo Einkommen="234.56">-3328.5800000000004</Saldo>
<Saldo Einkommen="1234.56">272.92999999999984</Saldo>
<Saldo Einkommen="5430">1141.9799999999996</Saldo>
<Saldo Einkommen="321.45">-2432.49</Saldo>
<Saldo Einkommen="987.58">-1623.38</Saldo>
<Saldo Einkommen="654.21">238.45000000000005</Saldo>
<Saldo Einkommen="333.33">-407.36999999999995</Saldo>
<Saldo Einkommen="456">274.08000000000004</Saldo>
<Saldo Einkommen="876.54">720.5999999999999</Saldo>
<Saldo Einkommen="546.77">507.79999999999995</Saldo>
<Saldo Einkommen="777.77">673.81</Saldo>
<Saldo Einkommen="357">357</Saldo>
<Saldo Einkommen="6789">5957.5599999999995</Saldo>
<Saldo Einkommen="234">30.810000000000002</Saldo>
<Saldo Einkommen="321">-487.13</Saldo>
<Saldo Einkommen="456">-1099.98</Saldo>
<Saldo Einkommen="3450">3125.1800000000003</Saldo>
<Saldo Einkommen="222">79.10999999999999</Saldo>
<Saldo Einkommen="135">-829.0699999999999</Saldo>
<Saldo Einkommen="321.45">321.45</Saldo>

Ähnlich funktioniert das im folgenden Beispiel:


<ergebnis>{
  let $input := 
  <a>
    <b>
      <c>
          <ID>123</ID>
          <Vorname>Tanja</Vorname>
          <Nachname>Tadellos</Nachname>
      </c>
      <c>
          <ID>456</ID>
          <Vorname>Berta</Vorname>
          <Nachname>Brotlos</Nachname>
      </c>
    </b>
  </a>  
   return $input/b/c ! Vorname
}</ergebnis>

Das Ergebnis lautet hier:


<ergebnis>
  <Vorname>Tanja</Vorname>
  <Vorname>Berta</Vorname>
</ergebnis>

Siehe auch .

wg / 22. April 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




XPath

XPath-Operatoren

||

=>



Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Operatoren5.html