Pokud do výstupu potřebujeme zařadit část (nebo i celý) vstupní dokument, můžeme použít některou z funkcí pro kopírování uzlů.
Pokud chceme od určitého místa zkopírovat všechny potomky, je
nejvhodnější použít instrukci <xsl:copy-of>
. Následující ukázka
obsahuje styl, který vytvoří identickou kopii vstupního XML
dokumentu.
Příklad 11.7. Hluboké kopírování pomocí <xsl:copy-of>
– copy-of.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
Pokud chceme do výstupu zařadit pouze kopii aktuálního uzlu, bez
jeho dalších potomků, můžeme k tomu použít instrukci <xsl:copy>
. Implicitně se nekopírují
atributové uzly, pro ně musíme instrukci vyvolat
samostatně. Následující ukázka opět slouží ke zkopírování vstupního
dokumentu. Jsou kopírovány pouze elementy, atributy a textové
uzly. Komentáře a instrukce pro zpracování se nezkopírují.
Příklad 11.8. Mělké kopírování pomocí <xsl:copy>
– copy.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="@*|*|text()"> <xsl:copy> <xsl:apply-templates select="@*|*|text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Na rozdíl od předchozího případu není kopie provedena jedním voláním, ale postupně se pro všechny kopírované uzly vstupního dokumentu vyvolává šablona, která kopíruje vždy jen jeden uzel.
Chceme-li zkopírovat všechny uzly včetně komentářů, můžeme
s výhodou využít test uzlu node()
.
Příklad 11.9. Kopírování všech uzlů – copy-all.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet>