| 
  
	  	copy-of 
        Nous avons vu comment générer une sortie basée sur 
        la valeur textuelle des éléments du document XML initial. 
        Il peut parfois être intéressant de générer 
        en sortie un élément du document source sans y apporter 
        de modification (i.e.  copier dans l'arbre 
        résultat une partie de l'arborescence source). C'est ce que 
        réalise l'instruction copy-of  : 
        XML source
         
           
            | <couples> <couple><form>Il</form><lemma>il</lemma></couple>
 <couple><form>était</form><lemma>être</lemma></couple>
 <couple><form>une</form><lemma>un</lemma></couple>
 <couple><form>fois</form><lemma>fois</lemma></couple>
 <couples>
 |   
            | XSL |  | XML résultat |   
            |  <xsl:template match="/"><liste-items>
 <xsl:apply-templates/>
 </liste-items>
 </xsl:template>
 
 <xsl:template match="couple">
 <item>
 <num>
 <xsl:value-of 
                select="position()"/>
 </num>
 <xsl:copy-of 
                select="."/>
 </item>
 </xsl:template>
 
 |  | <liste-items> <item>
 <num>1</num>
 <couple>
 <form>Il</form>
 <lemma>il</lemma>
 </couple>
 </item>
 <item>
 <num>2</num>
 <couple>
 <form>était</form>
 <lemma>être</lemma>
 </couple>
 </item>
 <item>
 <num>3</num>
 <couple>
 <form>une</form>
 <lemma>un</lemma>
 </couple>
 </item>
 <item>
 <num>4</num>
 <couple>
 <form>fois</form>
 <lemma>fois</lemma>
 </couple>
 </item>
 </liste-items>
 |  copy 
          Nous venons de voir comment l'instruction copy-of  
        permet de recopier intégralement l'élément XML désigné 
        par l'attribut select . L'instruction 
        copy , appliquée dans un patron, 
        a pour effet de créer une paire de balises (ouvrante et fermante) 
        dont le nom est celui de l'élément courant. Dans l'exemple 
        précédent, si nous remplaçons l'instruction <xsl:copy-of 
        select="."/>  par <xsl:copy/> , 
        nous obtenons le résultat suivant :  <liste-items>En effet, l'instruction <xsl:copy/> 
      est équivalente à :<item><num>1</num><couple/></item>
 <item><num>2</num><couple/></item>
 <item><num>3</num><couple/></item>
 <item><num>4</num><couple/></item>
 </liste-items>
 
  <xsl:element name="{name(.)}"/>(element sera vu dans la page 
      suivante) L'instruction ne copie ni les descendants du noeud courant, ni les attributs 
      éventuels. Une manière de copier les descendants peut être :
 
	  	On peut également ajouter dans l'élément en cours de 
      copie des éléments nouveaux. Dans l'exemple précédent, 
      si l'on veut faire en sorte que l'élément num 
      soit imbriqué dans l'élément couple, 
      on peut écrire (suppression de la balise item 
      et déplacement de la balise num) :
			
          | <xsl:template match="/"> <liste-items>
 <xsl:apply-templates/>
 </liste-items>
 </xsl:template>
 
 <xsl:template match="couple">
 <item>
 <num>
 <xsl:value-of select="position()"/>
 </num>
 <xsl:copy>
 <xsl:apply-templates/>
 </xsl:copy>
 </item>
 </xsl:template>
 
 <!-- copie à l'identique de tous les 
            descendants de couple -->
 <xsl:template match="//couple//*">
 <xsl:copy-of select="."/>
 </xsl:template>
 | ou | <xsl:template match="/"> <liste-items>
 <xsl:apply-templates/>
 </liste-items>
 </xsl:template>
 
 <xsl:template match="couple">
 <item>
 <num>
 <xsl:value-of select="position()"/>
 </num>
 <xsl:copy>
 <!-- 
            copie de tous les enfants -->
 <xsl:copy-of 
            select="./*"/>
 </xsl:copy>
 </item>
 </xsl:template>
 |  
			
				| XSL |  | Résultat |  
          | <xsl:template match="/"> <liste-items>
 <xsl:apply-templates/>
 </liste-items>
 </xsl:template>
 
 <xsl:template match="couple">
 <xsl:copy>
 <num>
 <xsl:value-of select="position()"/>
 </num>
 
 <xsl:copy-of 
            select="./*"/>
 </xsl:copy>
 </xsl:template>
 |  | <liste-items> <couple>
 <num>1</num>
 <form>Il</form>
 <lemma>il</lemma>
 </couple>
 ...
 </liste-items>
 |  Revenons sur l'exemple de départ :
 
  <?xml version="1.0" encoding="iso-8859-1"?>et supposons que pour chaque token, nous voulions insérer un jalon pour 
      obtenir (en vue d'un traitement quelconque) un résultat du type :<doc>
 <taggersent id="sent-1">
 <taggertoken wordform="Il" 
          lemma="il" pos="PRO"/>
 <taggertoken wordform="était" 
          lemma="être" pos="VER:sg"/>
 <taggertoken wordform="une" 
          lemma="un" pos="DET:femi:sg"/>
 <taggertoken wordform="fois" 
          lemma="fois" pos="NOM:femi:sg"/>
 ...
 </taggersent>
 </doc>
  <?xml version="1.0" encoding="iso-8859-1"?><doc>
 <taggersent id="sent-1">
 <milestone id="1"/><taggertoken 
        wordform="Il" lemma="il" pos="PRO"/>
 <milestone id="2"/><taggertoken 
        wordform="était" lemma="être" pos="VER:sg"/>
 <milestone id="3"/><taggertoken 
        wordform="une" lemma="un" pos="DET:femi:sg"/>
 <milestone id="4"/><taggertoken 
        wordform="fois" lemma="fois" pos="NOM:femi:sg"/>
 ...
 </taggersent>
 </doc>
 
 
	  	
			
          | Si nous écrivons la feuille suivante : |  | nous obtenons : |  
			
          | <xsl:template match="*"> <xsl:copy>
 <xsl:apply-templates/>
 </xsl:copy>
 </xsl:template>
 <xsl:template match="taggertoken"> <milestone id="{position()}"/>
 <xsl:copy>
 <xsl:copy-of 
              select="./*"/>
 </xsl:copy>
 </xsl:template>
 |  | <doc> <taggersent>
 <milestone id="1"/><taggertoken/>
 <milestone id="2"/><taggertoken/>
 <milestone id="3"/><taggertoken/>
 <milestone id="4"/><taggertoken/>
 </taggersent>
 </doc>
 |  
			
          | Il faut donc les générer explicitement :
 XSL
 |  | (les attributs n'ont pas été reproduits) 
 Résultat
 |  
			
          | <xsl:template match="*"> <xsl:copy>
 <xsl:apply-templates/>
 </xsl:copy>
 </xsl:template>
 <xsl:template match="taggertoken"> <milestone id="{position()}"/>
 <xsl:copy>
 <xsl:copy-of 
              select="@*"/>
 <xsl:copy-of 
              select="./*"/>
 </xsl:copy>
 </xsl:template>
 |  | <doc> <taggersent id="sent-1">
 <milestone id="1"/><taggertoken 
            lemma="il" pos="PRO" wordform="Il"/>
 <milestone id="2"/><taggertoken 
            lemma="être" pos="VER:sg" wordform="était"/>
 <milestone id="3"/><taggertoken 
            lemma="un" pos="DET:femi:sg" wordform="une"/>
 <milestone id="4"/><taggertoken 
            lemma="fois" pos="NOM:femi:sg" wordform="fois"/>
 </taggersent>
 </doc>
 |  |