XSL-Übersicht / xsl:key

xsl:key

xsl:key

xsl:key erlaubt die Indizierung von Nodes in einer Sequenz durch ein key-value-Paar.

Das Attribut name deklariert den Namen des Schlüssels, match die Nodesequenz, use den Schlüsselwert.

Nehmen Sie dieses Beispieldokument:


<ROOT>
  <Einwohner>
   <id>10</id>
   <name>Ruhelos</name>
   <vorname>Rita</vorname>
   <strasse>Hinundweg</strasse>
  </Einwohner>
  <Einwohner>
   <id>3</id>
   <name>Sorglos</name>
   <vorname>Siggi</vorname>
   <strasse>Nixwieweg</strasse>
  </Einwohner>
</ROOT>

Nun setzen Sie einen xsl:key kPersid auf die id jedes Einwohner-Elements.


<xsl:key 
     name="kPersid" 
     match="Einwohner" 
     use="id"/>

Den deklarierten xsl:key kPersid können Sie dazu nutzen, ein Einwohner-Element präzise zu adressieren.


<xsl:template match="/">
 <Ergebnis>
  <xsl:for-each select="key('kPersid', '3')">
    <p>
      <ID><xsl:value-of select="id"/></ID>
      <NN><xsl:value-of select="name"/></NN>
      <VN><xsl:value-of select="vorname"/></VN>
    </p>
  </xsl:for-each>
 </Ergebnis>
</xsl:template>

Im vorliegenden Fall ist das nur ein einzelnes Element:


<Ergebnis>
  <p>
   <ID>3</ID>
   <NN>Sorglos</NN>
   <VN>Siggi</VN>
  </p>
</Ergebnis>

Ändern Sie den Key (nunmehr kPersstr) so, dass mehrere Items angesprochen werden können. Das ist der Fall, wenn mehrere Einwohner-Elemente denselben Childnode strasse haben.


<xsl:key 
     name="kPersstr" 
     match="Einwohner" 
     use="strasse"/>

Seit XSLT 2.0 können Sie statt des use-Attributs auch eine Sequenz generieren.


<xsl:key 
     name="kPersstr" 
     match="Einwohner">
   <xsl:sequence 
        select="strasse"/>
</xsl:key>

Ändern Sie auch die Auswertung in der Weise, dass Sie mehrere Keys auswerten können:


 <xsl:template match="/">
  <Ergebnis>
   <xsl:for-each 
        select="key('kPersstr', 
                     ('Hinundweg', 'Nixwieweg'))">
    <p>
     <ID><xsl:value-of select="id"/></ID>
     <NN><xsl:value-of select="name"/></NN>
     <VN><xsl:value-of select="vorname"/></VN>
     <WO><xsl:value-of select="strasse"/></WO>
    </p>
   </xsl:for-each>
  </Ergebnis>
 </xsl:template>

so finden Sie dieses Ergebnis:


<Ergebnis>
  <p>
   <ID>10</ID>
   <NN>Ruhelos</NN>
   <VN>Rita</VN>
   <WO>Hinundweg</WO>
  </p>
  <p>
   <ID>3</ID>
   <NN>Sorglos</NN>
   <VN>Siggi</VN>
   <WO>Nixwieweg</WO>
  </p>
</Ergebnis>

Dasselbe Resultat erhalten Sie auch durch die Arbeit mit "klassischem" XPath:


<xsl:for-each 
     select="//Einwohner
               [strasse=('Hinundweg', 'Nixwieweg')]">
...
</xsl:for-each>

wg / 5. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




xsl:merge



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