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