C#.NET * C++ * JAVASCRIPT * PYTHON * DIVERSES
XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT



XSL / Die XSLT - Struktur / comment()

comment()

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






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