Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

11.5 Kopírování uzlů

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>

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek