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



XSL / Die XSLT - Struktur / XPath 3.1: Map, xsl:map / XPath: map:for-each

XPath: map:for-each

XPath: map:for-each

➪ Neben for-each steht noch map:for-each zur Verfügung. map:for-each benötigt eine zusätzliche Funktion, die die Ergebnisse verkettet.

Signatur:


map:for-each(
     $map as map(*),
     $action as function(xs:anyAtomicType, item()*) as item()*
     ) 
     as item()*

Siehe https://www.w3.org/TR/xpath-functions-31/#func-map-for-each. Die Reihenfolge des Resultats ist nicht festgelegt. (The function is non-deterministic with respect to ordering (see 1.7.4 Properties of functions). This means that two calls with the same arguments are not guaranteed to process the map entries in the same order.). Vergleiche auch .

Nehmen Sie zur Abwechslung mal diese map-Variable:


<xsl:variable 
    name="vmapTTWWGG" 
    select="map{
    'TT':'Theo Traumlos', 
    'WW':'Willi Wunschlos', 
    'GG':'Gustav Grundlos'}"/>

"vmapTTWWGG" lässt sich so auswerten:


<xsl:template match="/">
 <root>
  <fn_for-each nr="map:1">
    <xsl:for-each 
       select="map:for-each($vmapTTWWGG, 
               function ($k, $v){$k})">
      <wert key="{.}">
        <xsl:value-of select="map:get($vmapTTWWGG, .)"/>
      </wert>
    </xsl:for-each>
  </root>
</xsl:template>

... und das Ergebnis ist:


<root>
  <fn_for-each nr="map:1">
   <wert key="GG">Gustav Grundlos</wert>
   <wert key="TT">Theo Traumlos</wert>
   <wert key="WW">Willi Wunschlos</wert>
  </fn_for-each>
</root>

Mit den enormen Möglichkeiten anonymer Funktionsaufrufe steht die Implementierung beliebiger Logiken frei. Viel Spaß beim Experimentieren!


<xsl:template match="/">
  <root>
  <fn_for-each nr="map:2">
    <xsl:for-each 
         select="map:for-each($vmap, 
                 function ($k, $v){ 
                   if ($k mod 2 = 1) then ($v) 
                   else ('kein Ergebnis')
                 })">
      <wert>
        <xsl:value-of select="."/>
      </wert>
    </xsl:for-each>
  </fn_for-each>
  </root>
</xsl:template>

Ich habe dieses Ergebnis erwartet, und Sie?


<root>
  <fn_for-each nr="map:2">
    <wert>kein Ergebnis</wert>
    <wert>Lotte Rielos</wert>
    <wert>kein Ergebnis</wert>
  </fn_for-each>
</root>

In XQuery funktioniert das Ganze selbstverständlich auch. Wie vorher, habe ich eine map-Variable "$vvar" mit Inhalten gefüllt und via map:merge weitere hinzugefügt; die neue Variable heißt "$vmerged".

Mittels map:for-each wird aus "$vmerged" jeder zweite Key herausgefiltert:


declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
<erg>
  {
    let $vvar := map{
         0:'Hugo Holzflos', 
         1:'Lotte Rielos', 
         2:'Resi Denzschlos'}
    let $vmerged := map:merge(($vvar, 
        map{3:'Zenzi Zwecklos'}, 
        map{4:'Wilma Wunschlos'}, 
        map{5:'Theo Traumlos'}))
    for $x in map:for-each($vmerged, 
       function ($k, $v){ 
        if ($k mod 2 = 1) then ($k) 
        else ()
       })
       return
    <WERT
      key="{$x}">  
      {map:get($vmerged, $x)}
    </WERT>
  }
</erg>

Übrig bleiben die Maps mit den Keys 1, 3, 5 und deren zugehörige Werte:


<erg>
  <WERT key="1">Lotte Rielos</WERT>
  <WERT key="3">Zenzi Zwecklos</WERT>
  <WERT key="5">Theo Traumlos</WERT>
</erg

wg / 7. April 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






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/map10.html