XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / XSLT-Tipps / XSLT 3.0, XPath 3.0 / Schattenkabinett
![]() |
![]() |
➪ In XSLT 3.0 ist es möglich, mit einem statischen Wert während der Präprozessing-Phase zu arbeiten.
Ein Schattenattribut (shadow attribute) trägt denselben Namen wie ein anderes Attribut, jedoch mit einem "_" als Präfix.
Wie in xsl:include beschrieben, können Sie andere XSL-Stylesheets in den aktuellen Transformationsaufruf einbinden. Die shadow attributes erlauben Ihnen beispielsweise, die Namen der einzubindenden Dateien automatisch zu bestimmen. Das ist sinnvoll bei mehrfacher Implementierung von Teillogiken (Templates, Funktionen, Variablen, Attribute-Sets), die unter demselben Namen, aber mit abweichender Logik, in diversen XSL-Dateien abgelegt sind. Über die automatische Namenszuweisung der externen XSL-Datei kommt die dort implementierte Logik zum Einsatz.
<xsl:param
name="vVersion"
static="yes"
select="2"
as="xs:integer"/>
<xsl:include _href="ausgelagert{$vVersion}.xsl"/>
<xsl:template match="/">
<ergebnis>
<xsl:call-template name="ausgeben">
<xsl:with-param name="p">Parameter</xsl:with-param>
</xsl:call-template>
</ergebnis>
</xsl:template>
Das Prinzip können Sie auch auf die Generierung des XPath-Statements übertragen:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="3.0">
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:param name="pOrt"
static="yes"
as="xs:string"
select=""Ort/name""/>
<xsl:param name="pMensch"
static="yes"
as="xs:string"
select="'Mensch[Gehalt > 1000]'"/>
<xsl:template match="/*">
<ROOT>
<xsl:apply-templates
_select="/Orte/{$pOrt}, //{$pMensch}"/>
<xsl:for-each
_select="//{$pMensch}">
<m>
<xsl:for-each
select="child::*[local-name() !='Kauf']">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
</m>
</xsl:for-each>
</ROOT>
</xsl:template>
<xsl:template _match="{$pOrt}">
<Stadt>
<xsl:value-of select="text()"/>
</Stadt>
</xsl:template>
<xsl:template _match="{$pMensch}">
<Person einkommen="{Gehalt}">
<xsl:value-of select="vorname/text()"/>
</Person>
</xsl:template>
</xsl:stylesheet>
Ergebnis:
<ROOT>
<Stadt>Neustadt</Stadt>
<Stadt>Darmstadt</Stadt>
<Stadt>Kapstadt</Stadt>
<Person einkommen="1234.56">Nicole</Person>
<Person einkommen="5430">Stefan</Person>
<Person einkommen="6789">Willi</Person>
<Person einkommen="3450">Betty</Person>
<m id="4" name="Nixlos" vorname="Nicole" Gehalt="1234.56" idOrt="1"/>
<m id="9" name="Sprachlos" vorname="Stefan" Gehalt="5430" idOrt="1"/>
<m id="5" name="Wasistlos" vorname="Willi" Gehalt="6789" idOrt="3"/>
<m id="6" name="Bodenlos" vorname="Betty" Gehalt="3450" idOrt="3"/>
</ROOT>
wg / 17. April 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de