XSL - Übersicht / xsl:attribute-set

xsl:attribute-set

xsl:attribute-set

Mit Hilfe von xsl:attribute-set kann eine ganze Anzahl einzelner xsl:attribute in einer Gruppierung vordefiniert werden, die schließlich mit Hilfe von xsl:use-attribute-sets komplett in das XML Element eingefügt wird.

xsl:attribute-set

Wie in bereits erläutert, ist es möglich, ein Attribut in ein übergeordnetes einzufügen. Werden dieselben Attribute in zahlreichen XML Elementen wiederholt benötigt, kann die Deklaration aufwändig werden. Das kann der Fall sein bei zahlreichen Attribut-orientierten Elementen wie etwa der Layout-Konfiguration von HTML oder FormattingObject (FO, z.B. PDF).

xsl:attribute-set hilft, häufig benutzte Attribute nur einmal deklarieren zu müssen, um sie beliebig oft wieder verwenden zu können.


  <xsl:attribute-set name="as_Person">
    <xsl:attribute name="nachname">Rielos</xsl:attribute>
    <xsl:attribute name="vorname">Lotte</xsl:attribute>
  </xsl:attribute-set>

Dabei kann ein xsl:attribute-set sich auch auf ein anderes xsl:attribute-set beziehen und dieses einbinden, z.B.


  <xsl:attribute-set name="mit_Hobby" 
       xsl:use-attribute-sets="as_Person">
    <xsl:attribute name="hobby">XSLT</xsl:attribute>
  </xsl:attribute-set>

Damit würde ein neues xsl:attribute-set namens "mit_Hobby" entstehen, das die drei Attribute nachname, vorname und hobby beinhaltet.

Damit diese gegenseitige Referenzierung übersichtlich und leicht wartbar bleibt (ohne in einer Code-Hölle zu münden), erscheint eine sorgfälzge Planung und Kontrolle geboten.

Um die Ansätze miteinander zu vergleichen, schauen wir uns das Template "Attributdemo" an:


  <xsl:template name="Attributdemo">
    <Person nachname="Sinnlos">
      <xsl:attribute name="vorname">Susi</xsl:attribute>
    </Person>
    <Person xsl:use-attribute-sets="as_Person" />
    <Person>
      <xsl:copy-of select="$vPerson/p/@*"/>
    </Person>    
  </xsl:template>

Der Aufruf dieses Templates generiert drei "Person"-Elemente mit folgenden Attributen:


   <Person nachname="Sinnlos" vorname="Susi"/>
   <Person nachname="Rielos" vorname="Lotte"/>
   <Person nachname="Holzflos" vorname="Hugo"/>

So weit, so gut. Alle drei Verfahren generieren jeweils ein Attribut "nachname" und ein Attribut "vorname", jeweils mit unterschiedlichen Inhalten - auch wenn es überraschen mag, daß ein xsl:copy-of ausreicht, um in ein Element Attributwerte einzubinden.

Deklarations-Konflikte?

Nur bedingt intuitiv nachvollziehbar (höherer Zeitaufwand für das Maintenance!) kann es jedoch werden, wenn die erwähnten Gestaltungsmöglichkeiten für dieselben Attribute konkurrierend verwendet werden. Da Attribute gleichen Namens jeweils nur einmal auftreten dürfen, ist entweder zu erwarten, daß der XSL-Prozessor sich weigert, oder daß die Attributwerte überschrieben werden.

Nehmen wir noch einmal das bereits in besprochene Beispiel.


  <xsl:variable name="vPerson">
    <p nachname="Holzflos" vorname="Hugo"/>
  </xsl:variable>

Deklarieren wir also ein Element "Person", indem wir dessen Attribute "nachname" und "vorname" auf verschiedene Weise definieren, aber in derselben Programmlogik. Welche Inhalte gewinnen?


  <Person nachname="Sinnlos" 
          xsl:use-attribute-sets="as_Person" >
    <xsl:attribute name="vorname">Susi</xsl:attribute>
    <xsl:copy-of select="$vPerson/p/@*"/>
  </Person>

Hier zeigen sich Unterschiede im Prozessoraufruf. Einige Prozessoren weigern sich glattweg, so etwas mitzumachen. Es gibt aber auch XSL-Prozessoren (auch für XSL 2.0 und 3.0), die nicht meckern, sondern die Werte überschreiben. The winner is:


   <Person nachname="Holzflos" vorname="Hugo"/>

xsl:attribute-set in XSLT generieren

Möglich ist auch, ein xsl:attribute-set durch den Aufruf von xsl:template zu bilden, wie das folgende Beispiel zeigt.


<xsl:stylesheet 
  version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template name="generateAttribute">
  <xsl:for-each 
      select="//Mensch[Gehalt &lt; 500]">
   <xsl:value-of select="name" />
   <xsl:if test="position() != last()">
    <xsl:text>,</xsl:text>
   </xsl:if>
  </xsl:for-each>
 </xsl:template>
 <xsl:attribute-set name="attrset1">
  <xsl:attribute name="a1">A1</xsl:attribute>
  <xsl:attribute name="a2">
   <xsl:call-template name="generateAttribute" />
  </xsl:attribute>
 </xsl:attribute-set>
 <xsl:variable name="v1">
  <VARIABLE1 xsl:use-attribute-sets="attrset1" />
 </xsl:variable>
</xsl:stylesheet>

Datei: externeVariable1.xsl

wg / 30. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/attributesets.html