2016-07-22 14 views
0

Was ich hier erreichen möchte, ist ein Element (einschließlich seiner untergeordneten Knoten) zu verschieben und dann einen untergeordneten Knoten innerhalb dieses Elements hinzuzufügen oder umgekehrt. Es scheint, dass ich immer nur eine Sache machen kann. Ist es möglich, beides gleichzeitig zu tun?Wie kann man ein XML-Element verschieben und gleichzeitig ein untergeordnetes Element mit XSLT hinzufügen?

Hier ist meine Eingabe xml

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <box1> 
     <cd1> 
      <title>Title 1</title> 
      <artist>Bob Dylan</artist> 
      <year>1985</year> 
     </cd1> 
     <cd2> 
      <title>Title 2</title> 
      <artist>Bonnie Tyler</artist> 
      <year>1988</year> 
     </cd2> 
    </box1> 
    <box2> 
     <cd3> 
      <title>Title 3</title> 
      <artist>Metallica</artist> 
     </cd3> 
    </box2> 
</catalog> 

Würde die Ausgabe haben möchte ähnliche

<catalog> 
<box1> 
    <cd1> 
     <title>Title 1</title> 
     <artist>Bob Dylan</artist> 
     <year>1985</year> 
    </cd1> 
    <cd2> 
     <title>Title 2</title> 
     <artist>Bonnie Tyler</artist> 
     <year>1988</year> 
    </cd2> 
    <cd3> 
     <title>Title 3</title> 
     <artist>Metallica</artist> 
     <year>1990</year> 
    </cd3> 
</box1> 

Wie Sie Element CD3 bewegt und ein Kind-Knoten hinzugefügt wird, wie gut sehen kann.

Hier ist, was ich getan habe und alles, was es tut, nur das Element bewegt, egal welche Reihenfolge ich des Codes.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- add a child element --> 
    <xsl:template match="cd3"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
      <year>1990</year> 
     </xsl:copy> 
    </xsl:template> 

    <!-- move node --> 
    <xsl:template match="/catalog"> 
     <xsl:copy> 
       <xsl:apply-templates /> 
       <xsl:copy-of select="box2/cd3"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="box2"/> 

</xsl:stylesheet> 

Antwort

0

ändern <xsl:copy-of select="box2/cd3"/> zu <xsl:apply-templates select="box2/cd3"/> und <xsl:template match="/catalog">-<xsl:template match="/catalog/box1"> ändern.

+0

Martin, ich tat, wie Sie vorgeschlagen und das Element wird nicht angezeigt. – user1998820

+0

@ user1998820, ja, es scheint, mit Ihrem ursprünglichen Stylesheet war es ein bisschen schwierig, nur einige Änderungen vorzuschlagen, der Vorschlag, 'apply-templates' zu verwenden, ist korrekt, außerdem die Änderung zu' ' vereinfacht auch den Ansatz, aber ich habe übersehen, dass Sie dann auch den Pfad der Anwendungsvorlagen an '' anpassen müssen. –

0

Ich habe es mit dem folgenden Code gelöst. Danke für die Hilfe, hat mich mit weiteren Untersuchungen begonnen.

<xsl:template match="/catalog"> 
    <xsl:copy> 
     <box1> 
      <xsl:apply-templates /> 
      <xsl:apply-templates select="box2/cd3"/> 
     </box1> 
    </xsl:copy> 
</xsl:template> 
Verwandte Themen