2017-04-04 3 views
0

Ich muss die Reihenfolge von zwei Elementen wechseln und dann den Klassennamen auf beiden ändern. TeilWie ändere ich einen Attributwert, während ich die Reihenfolge zweier Elemente ändere?

Dies ist der Schalt:

<xsl:template match="div[@id='container-4']/div[starts-with(@class,'df-width-40')]"> 

     <xsl:copy-of select="div[@id='container-5']/div[@class='df-width-100']/div" /> 

    </xsl:template> 


    <xsl:template match="div[@id='container-5']/div[@class='df-width-100']"> 

     <xsl:copy-of select="div[@id='container-4']/div[@class='df-width-40']/div" /> 

    </xsl:template> 

Der obige Code soll, folgendes tun: Ersetzen der div.df-Breite-40 in der # 4-Container mit der div.df Breiten -100 von # container-5.

Dann ersetzen Sie die div.df-Breite-100 von # container-5 mit der div.df-Breite-40 von # container-4.

Im Grunde nur die Child Divs in # Container-4 und # Container-5.

Aber ich brauche auch die Klassennamen zu ändern, damit die div.df-Breite-40 Änderungen div.df-Breite-100 nennen, und vice verca

Original-xml:

<div id="container-4"> 
    <div class="df-width-40">lorem</div> 
</div> 

<div id="container-5"> 
    <div class="df-width-100">ipsum</div> 
</div> 

Gesucht Ergebnis nach xslt:

<div id="container-4"> 
    <div class="df-width-40">ipsum</div> 
</div> 

<div id="container-5"> 
    <div class="df-width-100">lorem</div> 
</div> 

Caveat: kann ich nicht nur den Inhalt der div-Tags erhalten aufgrund der komplexen Layout und dynamische Inhalte, die ich keine Kontrolle haben über. Die Xpath- und Elementklassennamen wurden zur besseren Übersichtlichkeit reduziert.

+0

Ziehen Sie in Betracht, die XML-Eingabe und den XSLT-Code auf minimale, aber vollständige Stichproben zu reduzieren, damit wir das Problem reproduzieren können. Es ist nicht klar, ob die Elemente, mit denen Sie bei den ersten beiden Vorlagen übereinstimmen, die gleichen sind, deren Attribut Sie abgleichen möchten. Da Ihre ersten beiden Templates keine 'Apply-Templates' verwenden, sondern stattdessen ein' div' Ergebnis erzeugen und Knoten kopieren, sehe ich nicht, warum Sie erwarten, dass das andere Template verwendet wird. Wenn die Elemente nicht zusammenhängen, dann zeigen Sie bitte die entsprechende Eingabe an. –

+0

Hallo, @MartinHonnen. Ich habe mein Bestes versucht, um es ein bisschen klarer zu machen, was mein Ziel ist, und änderte auch die Frage etwas (vom Ändern des Klassennamens eines der divs zu beiden). Bitte lassen Sie mich wissen, wenn es noch unklar ist. – Shaidar

Antwort

1

Wenn Sie die vorhandene div und sein Attribut kopieren (n) und dann nur den Inhalt der divs tauschen, wie in

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

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

    <xsl:template match="div[@id='container-4']/div[starts-with(@class,'df-width-40')]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*, 
      ../following-sibling::div[@id='container-5']/div[@class='df-width-100']/node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="div[@id='container-5']/div[@class='df-width-100']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*, 
      ../preceding-sibling::div[@id='container-4']/div[@class='df-width-40']/node()"/>   
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

dann sollten Sie das Ergebnis erhalten Sie wollen,

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
<div id="container-4"> 
    <div class="df-width-40">lorem</div> 
</div> 

<div id="container-5"> 
    <div class="df-width-100">ipsum</div> 
</div> 
</body> 

in

<?xml version="1.0" encoding="UTF-8"?><body> 
<div id="container-4"> 
    <div class="df-width-40">ipsum</div> 
</div> 

<div id="container-5"> 
    <div class="df-width-100">lorem</div> 
</div> 
</body> 
transformierte

http://xsltransform.net/bEzjRJm

+0

Danke, das hat wie ein Charme funktioniert :) – Shaidar

Verwandte Themen