XSL - Übersicht / xsl:copy, xsl:copy-of

xsl:copy, xsl:copy-of

xsl:copy, xsl:copy-of

xsl:copy generiert eine flache Kopie eines jeweils aktuellen Knotens. xsl:copy-of generiert eine tiefe Kopie eines jeweils aktuellen Knotens.

xsl:copy, xsl:copy-of

xsl:copy

Bei xsl:copy wird eine flache Kopie eines jeweils aktuellen Knotens erstellt, d.h. ohne seine Childnodes: das heißt auch ohne seinen Textinhalt.


 <xsl:template match="/">   
  <ergebnis>
   <xsl:for-each select="//Ort/name">
    <xsl:copy/>
     </xsl:for-each>   
  </ergebnis>
 </xsl:template>

Das Ergebnis dieser Aktion sehen wir hier:


<ergebnis>
   <name/>
   <name/>
   <name/>
</ergebnis>

Ist dem Knoten ein Namespace zugeordnet, so wird auch dieser mitkopiert. Das Attribut "copy-namespaces", das erst seit XSLT 2.0 besteht und die Werte (true | false | no | yes ) beinhalten kann (in XSLT 3.0 kommen noch die Alternativen 0 | 1 hinzu), entscheidet, ob auch die dem Element zugehörigen Namensraumknoten mitkopiert werden.


 <xsl:variable name="vtmpcopy">
  <xsl:for-each select="//ns2:Ort/ns5:name">
   <xsl:copy copy-namespaces="0"/>
  </xsl:for-each>
 </xsl:variable>
 <xsl:template match="/">   
  <ergebnis>
   <xsl:for-each select="$vtmpcopy/child::*">
    <xsl:copy/>
     </xsl:for-each>   
  </ergebnis>
 </xsl:template>

Defaultwert für "copy-namespaces" ist "true": dann würden alle relevanten Namensraumknoten mitkopiert. Bei Aufruf von "false" wird nur der aktuelle Namensraumknoten wiedergegeben.


<ergebnis>
   <name xmlns="www.wilfried-grupe.de/Beispiele/2018"/>
   <name xmlns="www.wilfried-grupe.de/Beispiele/2018"/>
   <name xmlns="www.wilfried-grupe.de/Beispiele/2018"/>
</ergebnis>

Sollen die Textnodes, die den Elementen zugeordnet sind, mitkopiert werden, empfiehlt sich ein einfaches Template:


 <xsl:template match="name | vorname">
  <xsl:copy copy-namespaces="no">
   <xsl:value-of select="."/>
  </xsl:copy>
 </xsl:template>

... oder analog über :


 <xsl:variable name="vtmpcopy">
  <xsl:for-each 
       select="//name | //vorname">
   <xsl:copy copy-namespaces="no">
    <xsl:value-of select="."/>
   </xsl:copy>
  </xsl:for-each>
 </xsl:variable>

Die Sequenz der angesprochenen Items läßt sich selbstverständlich durch () sowie () ergänzen.

xsl:copy hat in XSLT 2.0 folgende mögliche Attribute:

In XSLT 3.0 kommen folgende möglichen Attribute hinzu bzw. haben folgende Erweiterungen:

xsl:copy-of

Im Gegensatz zur flachen Kopie bei xsl:copy handelt es sich bei xsl:copy-of um die tiefe Kopie eines Knotens, mit allen descendant-, Text-, Attribut-, Kommentar- und Processing-Instructions-Knoten.


 <xsl:template match="/">   
  <ergebnis>
   <xsl:for-each 
        select="//ns2:Ort[1]/ns3:Mensch[1]">
     <xsl:copy-of 
          select="." 
          copy-namespaces="no"/>
   </xsl:for-each>   
  </ergebnis>
 </xsl:template>

Auch hier gibt es die Möglichkeit, via "copy-namespaces" die Ausgabe der Namespaces zu beeinflussen. copy-namespaces="yes" hat zur Wirkung, daß alle Namensraumknoten (auch der descendant- etc. Knoten) im jeweiligen Knoten einmal abgebildet werden. Bei copy-namespaces="no" erhält jeder Childnode seinen Namespace als lokalen Default-Namespace.

Verwendung findet xsl:copy-of häufig beim Aufbau temporärer XML-Bäume, die quasi eine Zwischenkonvertierung darstellen, von denen sich dann effizienter weiter arbeiten läßt.

Der Variable "vtmpcopy" werden eine ganze Anzahl von Childnodes "Mensch" zugewiesen, deren "vorname" einem bestimmten Pattern entspricht. Neben dem "vorname" stehen aber auch alle weiteren Descendant-Nodes bereit.


 <xsl:variable name="vtmpcopy">
  <xsl:for-each 
       select="//Mensch[matches(vorname, '[H][a-z]+')]">
   <xsl:copy-of select="." />
  </xsl:for-each>
 </xsl:variable>

Im eigentlichen Aufruf kann dieser temporäre Baum gezielt ausgewertet werden:


 <xsl:template match="/">   
  <ergebnis>
   <xsl:for-each 
        select="$vtmpcopy/Mensch">
    <vn>
     <xsl:value-of 
          select="vorname"/>
    </vn>
   </xsl:for-each>   
  </ergebnis>
 </xsl:template>

Und das Ergebnis sieht dann so aus:


<ergebnis>
   <vn>Hugo</vn>
   <vn>Heini</vn>
   <vn>Horst</vn>
</ergebnis>

xsl:copy-of hat in XSLT 2.0 folgende mögliche Attribute:

In XSLT 3.0 kommen folgende möglichen Attribute hinzu bzw. haben folgende Erweiterungen:

XPath: copy-of

Die XPath-Funktion copy-of liefert eine tiefe Kopie einer Sequenz zurück. Vergleiche auch und .


 <xsl:for-each 
      select="copy-of(//Mensch/vorname)">
     <wert>
         <xsl:value-of select="."/>
     </wert>
 </xsl:for-each>

wg / 31. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/copy_of.html