XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / Die XSLT - Struktur / comment()
![]() |
![]() |
➪ comment() erlaubt den Zugriff auf Kommentar-Nodes.
comment() eignet sich herrvorragend zur Erstellung einer Dokumentation von XSL-Stylesheets. Nehmen Sie das folgende XSL-Programm als Beispiel:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wg="beispiel"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="xs fn">
<xsl:output method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"/>
<!--Start der Anwendung-->
<xsl:template match="/">
<ROOT>
<xsl:call-template name="intersectdemo"/>
</ROOT>
</xsl:template>
<!--verkettet Ort[1] und Ort[2] zu einer Sequenz-->
<xsl:variable name="v1" select="/Orte/Ort[1], /Orte/Ort[2]"/>
<!--verkettet Ort[2] und Ort[3] zu einer Sequenz-->
<xsl:variable name="v2" select="/Orte/Ort[2], /Orte/Ort[3]"/>
<!--demonstriert die Verwendung von Komma als Verkettungsoperator-->
<xsl:template name="concatdemo">
<xsl:for-each select="$v1, $v2">
<y>
<xsl:value-of select="name"/>
</y>
</xsl:for-each>
</xsl:template>
<!--demonstriert die Verwendung von union als Vereinigungsoperator-->
<xsl:template name="uniondemo">
<!--| ist union, Vereinigungsmenge-->
<xsl:for-each select="$v1 union $v2">
<y>
<xsl:value-of select="name"/>
</y>
</xsl:for-each>
</xsl:template>
<!--demonstriert die Verwendung von except als Ausschlussoperator-->
<xsl:template name="exceptdemo">
<!--Ausschlussmenge: A ohne B-->
<xsl:for-each select="$v1 except $v2">
<y>
<xsl:value-of select="name"/>
</y>
</xsl:for-each>
</xsl:template>
<!--demonstriert die Verwendung von intersect als Schnittmengenoperator-->
<xsl:template name="intersectdemo">
<!--Schnittsmenge: A geschnitten B-->
<xsl:for-each select="$v1 intersect $v2">
<y>
<xsl:value-of select="name"/>
</y>
</xsl:for-each>
</xsl:template>
<!--Addiert zwei xs:int-Parameter und gibt den Wert als Sequenz zurueck-->
<xsl:function name="wg:addiere" as="xs:int">
<xsl:param name="a" as="xs:int"/>
<xsl:param name="b" as="xs:int"/>
<xsl:sequence select="xs:int($a + $b)"/>
</xsl:function>
<!--demonstriert die Verwendung der separaten function wg:addiere-->
<xsl:template name="Functiondemo">
<xsl:value-of select="wg:addiere(xs:int(40), xs:int(5))"/>
</xsl:template>
<!--demonstriert die Arbeit mit Sequenzen-->
<xsl:template name="Sequenzdemo">
<xsl:variable name="v_seq" select="1 to 10, 'Nixlos', 57.9, //name"/>
<!--<xsl:for-each select="$v_seq">
<item>
<xsl:value-of select="."/>
</item>
</xsl:for-each>-->
<xsl:value-of select="sum($v_seq[. castable as xs:int][xs:int(.)])"/>
</xsl:template>
<!--demonstriert die Arbeit mit for-each-group-->
<xsl:template name="Gruppierungen">
<Artikelliste>
<xsl:for-each-group select="//Kauf" group-by="bez">
<xsl:sort select="fn:current-grouping-key()" order="ascending"/>
<Artikel name="{fn:current-grouping-key()}"
umsatz="{sum(fn:current-group()/Gesamt)}">
<xsl:for-each-group select="fn:current-group()"
group-by="../../id">
<xsl:sort select="../../name" order="ascending"/>
<Ort name="{../../name}"
umsatz="{sum(fn:current-group()/Gesamt)}">
<xsl:for-each-group select="fn:current-group()"
group-by="../id">
<xsl:sort select="../name" order="ascending"/>
<Kunde umsatz="{sum(fn:current-group()/Gesamt)}">
<xsl:for-each
select="../child::*[name()!='Kauf'][name()!='idOrt']">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</Kunde>
</xsl:for-each-group>
</Ort>
</xsl:for-each-group>
</Artikel>
</xsl:for-each-group>
</Artikelliste>
</xsl:template>
<!--demonstriert die Arbeit mit der translate-function-->
<xsl:template name="translatedemo">
<xsl:variable name="v">lwlh2e7649ync,laNL*:08721LÖOMSDAÖFV</xsl:variable>
<xsl:value-of select="translate($v, translate($v, '0987654321', ''), '')"/>
</xsl:template>
<!--demonstriert die Arbeit mit xsl:result-document-->
<xsl:template name="outputdokumente">
<xsl:for-each select="/Orte/Ort">
<xsl:result-document
href="../output/{name}.xml"
exclude-result-prefixes="xs fn wg"
encoding="ISO-8859-1"
indent="no">
<xsl:copy-of select="."/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<!--die Variable vjson beinhaltet einen JSON-String-->
<xsl:variable name="vjson">[
{"id":"1","name":"Holzflos","vorname":"Hugo"},
{"id":"2","name":"Sagblos","vorname":"Stefan"},
{"id":"8","name":"Rhodos","vorname":"Rudi"},
{"id":"15","name":"Kolos","vorname":"Karl"},
{"id":"19","name":"Lustlos","vorname":"Ludwig"},
{"id":"10","name":"Ruhelos","vorname":"Rita"},
{"id":"11","name":"Schlaflos","vorname":"Susi"},
{"id":"12","name":"Rielos","vorname":"Lotte"},
{"id":"13","name":"Muehelos","vorname":"Martin"},
{"id":"14","name":"Leinenlos","vorname":"Liane"}
]</xsl:variable>
<!--demonstriert die Arbeit mit json-to-xml-->
<xsl:template name="json2xml_demo">
<xsl:copy-of select="json-to-xml($vjson)"/>
</xsl:template>
</xsl:stylesheet>
Das folgende XSL-Stylesheet nimmt das vorhergehende als XML-Input, greift auf sämtliche xsl:function, xsl:template, xsl:variable zu und listet neben deren Namen und Attributliste auch jenen Kommentarknoten auf, die dem jeweiligen Element unmittelbar vorangehen. Entscheidend ist dafür die Zeile [preceding::comment()[position()=1]].
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<table>
<xsl:for-each
select="/xsl:stylesheet/child::*[name()!='xsl:output']">
<tr>
<td>
<xsl:value-of select="name()"/>
<xsl:for-each select="attribute::*">
<xsl:text> </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:for-each>
</td>
<td>
<xsl:value-of
select="[preceding::comment()[position()=1]]"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Das Resultat:
<html>
<body>
<table>
<tr>
<td>xsl:template match="/"</td>
<td>Start der Anwendung</td>
</tr>
<tr>
<td>xsl:variable name="v1" select="/Orte/Ort[1], /Orte/Ort[2]"</td>
<td>verkettet Ort[1] und Ort[2] zu einer Sequenz</td>
</tr>
<tr>
<td>xsl:variable name="v2" select="/Orte/Ort[2], /Orte/Ort[3]"</td>
<td>verkettet Ort[2] und Ort[3] zu einer Sequenz</td>
</tr>
<tr>
<td>xsl:template name="concatdemo"</td>
<td>demonstriert die Verwendung von Komma als Verkettungsoperator</td>
</tr>
<tr>
<td>xsl:template name="uniondemo"</td>
<td>demonstriert die Verwendung von union als Vereinigungsoperator</td>
</tr>
<tr>
<td>xsl:template name="exceptdemo"</td>
<td>demonstriert die Verwendung von except als Ausschlussoperator</td>
</tr>
<tr>
<td>xsl:template name="intersectdemo"</td>
<td>demonstriert die Verwendung von intersect als Schnittmengenoperator</td>
</tr>
<tr>
<td>xsl:function name="wg:addiere" as="xs:int"</td>
<td>Addiert zwei xs:int-Parameter und gibt den Wert als Sequenz zurueck</td>
</tr>
<tr>
<td>xsl:template name="Functiondemo"</td>
<td>demonstriert die Verwendung der separaten function wg:addiere</td>
</tr>
<tr>
<td>xsl:template name="Sequenzdemo"</td>
<td>demonstriert die Arbeit mit Sequenzen</td>
</tr>
<tr>
<td>xsl:template name="Gruppierungen"</td>
<td>demonstriert die Arbeit mit for-each-group</td>
</tr>
<tr>
<td>xsl:template name="translatedemo"</td>
<td>demonstriert die Arbeit mit der translate-function</td>
</tr>
<tr>
<td>xsl:template name="outputdokumente"</td>
<td>demonstriert die Arbeit mit xsl:result-document</td>
</tr>
<tr>
<td>xsl:variable name="vjson"</td>
<td>die Variable vjson beinhaltet einen JSON-String</td>
</tr>
<tr>
<td>xsl:template name="json2xml_demo"</td>
<td>demonstriert die Arbeit mit json-to-xml</td>
</tr>
</table>
</body>
</html>
wg / 26. Januar 2020
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