4.1.6.2  Beispiel Mantel Dokument

Im Bereich EDI Datenaustausch werden große XML Dateien versendet, die man auf einzelne Transmissions aufsplitten will, um sie in einer XML Datenbank abspeichern zu können. Die Struktur einer Datenübertragung könnte folgendermassen aussehen:

WRAPPER1
  SEQUENZ1
  SEQUENZ2
  SEQUENZ3
  WRAPPER2
    SEQUENZ1
    SEQUENZ2
    SEQUENZ3
    SEQUENZ4
    WRAPPER3
      SEQUENZ1
      SEQUENZ2
      CONTENT
        DATA1
        DATA2
        DATA3
        DATA4
        DATA5
      CONTENT
        DATA1
        DATA2
        DATA3
        DATA4
        DATA5
      WRAPPER4
        SEQUENZ1
      CONTENT
        DATA1
        DATA2
        DATA3
        DATA4
        DATA5
      [...]
Plain Text

Jedes einzelne CONTENT Element soll nun einen Mantel erhalten und separat in einer Datei abgelegt werden. Der "Umschlag" soll dabei alle Elemente des Rahmens der Transmission erhalten. Das ist alles auf der Descendant-Achse bis zum Element WRAPPER3 , ausserdem noch die Elemente SEQUENZ1 und SEQUENZ2 , sowie das Element WRAPPER4 mit Kind SEQUENZ1 . Ohne groß auf die Performanz zu achten, könnte das recht einfach so realisiert werden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>
  
  <xsl:template match="/">
    <xsl:apply-templates select="/WRAPPER1/WRAPPER2/WRAPPER3/CONTENT" mode="umschlag"/>
  </xsl:template>
    
  <xsl:template match="CONTENT" mode="umschlag">
    <xsl:result-document href="{concat(@id,'.xml')}">
      <umschlag>
        <metadaten><!-- einige Metadaten --></env:metadata>
        <nutzdaten>
            <xsl:apply-templates select="ancestor::WRAPPER1">
              <xsl:with-param name="this-id" select="generate-id()" tunnel="yes"/>
            </xsl:apply-templates>
        </nutzdaten>
      </umschlag>
    </xsl:result-document>
  </xsl:template>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
    
  <xsl:template match="CONTENT">
    <xsl:param name="this-element" tunnel="yes"/>
    <xsl:if test="$this-id = generate-id()">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
    
</xsl:stylesheet>
Plain Text

Im rekursiven Abstieg wird im Modus "umschlag" jedes CONTENT Element selektiert und in einen Umschlag verpackt. Der eigentlich Inhalt des Umschlags wird generiert, indem der gesamte XML Baum über die Standard-Kopierregel XSLT Konstrukte Default-Kopierregel in das Element <nutzdaten> gesetzt wird. Dabei wird aber nur derjenige CONTENT Abschnitt evaluiert, der - zu der als Parameter übergebenen - generierten Id passt.