Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XSL-T / Die XSLT - Struktur / attributesets

attributesets

attributesets

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

Auf dieser Seite:

Wie in xsl:attribute bereits erläutert, ist es möglich, ein Attribut in ein übergeordnetes XML-Element einzufügen. Werden dieselben Attribute in zahlreichen XML-Elementen wiederholt benötigt, kann die Deklaration aufwendig 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 wiederverwenden 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ältige Planung und Kontrolle geboten.

Um die Ansätze miteinander zu vergleichen, schauen Sie sich 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"/>

Alle drei Verfahren generieren jeweils ein Attribut nachname und ein Attribut vorname, jeweils mit unterschiedlichen Inhalten. Auch wenn es überraschen mag, dass ein xsl:copy-of ausreicht, um in ein Element Attributwerte einzubinden.

Deklarationskonflikte?

Nur bedingt 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, dass der XSL-Prozessor sich weigert oder dass die Attributwerte überschrieben werden.

Ich nehme noch einmal das bereits in xsl:attribute erwähnte Beispiel.


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

Nun deklarieren Sie ein Element Person, indem Sie 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. In diesem Fall lautet das Ergebnis:


<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>

wg / 5. April 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




xsl:break



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