2011-04-27 22 views
5

Estoy utilizando la transformación de identidad y durante esta basada en una condición, necesito cambiar la posición de un nodo usando XSLT. Supongamos, tengo un XML como la que:Cambiar la posición de un nodo usando XSLT

<root> 
    <a> 
     <b1>SampleB1</b1> 
     <b2> 
      <c1>zyx</c1> 
      <c2>wvu</c2> 
      <c3>tsr</c3> 
      <c4>dtg</c4> 
      <c5>hkj</c5> 
     </b2> 
     <b3>SampleB3</b3> 
    </a> 
</root> 

entonces quiero cambiar la posición de los nodos 'c4' & 'c5' y quiere salida como:

<root> 
    <c4>dtg</c4> 
    <c5>hkj</c5> 
    <a> 
     <b1>SampleB1</b1> 
     <b2> 
      <c1>zyx</c1> 
      <c2>wvu</c2> 
      <c3>tsr</c3> 
     </b2> 
     <b3>SampleB3</b3> 
    </a> 
</root> 

Puede alguien por favor informe yo, ¿cómo podemos hacer esto?

Gracias !!!

Respuesta

0

Para reorganizar, debe ajustar su XSL para que copie lo que desea en el orden y la ubicación que desee. Por ejemplo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- At the root element, recurse through any descendant c4 or c5 nodes first --> 
    <xsl:template match="root"> 
     <xsl:copy> 
      <xsl:apply-templates select="//c4|//c5"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- At the b2 element, copy everything but the C4 or C5 nodes --> 
    <xsl:template match="b2"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()[not(self::c4|self::c5)]|@*"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

Sería mejor '' para la plantilla de contenido de la regla 'b2'. –

+0

Gracias Erica. Funciona !!! – Piyush

1

Prueba esto:

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

    <!-- By default, recursively copy all nodes unchanged --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- But don't copy root/a/b2/c3 and root/a/b2/c4 --> 
    <xsl:template match="root/a/b2/c3" /> 
    <xsl:template match="root/a/b2/c4" /> 

    <xsl:template match="root"> 
    <xsl:copy> 
     <!-- Place a copy of a/b2/c3 and a/b2/c4 at the start of root --> 
     <xsl:copy-of select="a/b2/c3" /> 
     <xsl:copy-of select="a/b2/c4" /> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

La clave para entender lo anterior es que no es mover elementos tanto como copiar elementos, y luego saltar a otra parte. Desafortunadamente, esto significa que necesitamos especificar los elementos para moverlos dos veces (una para saltearlos y luego una vez más para incluir una copia de ellos en otro lugar), pero por el momento no puedo pensar en una manera más ordenada.

Esta pregunta - Move sub nodes into parent attributes with XSLT también podría ser útil.

+0

Gracias Kragen !!! Su solución no funciona en mi caso ya que también estoy actualizando el nodo raíz y el nodo padre. – Piyush

1

estilo de tracción pura:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="a"> 
     <xsl:apply-templates mode="search"/> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="c4|c5"/> 
    <xsl:template match="c4|c5" mode="search"> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="text()" mode="search"/> 
</xsl:stylesheet> 

Salida:

<root> 
    <c4>dtg</c4> 
    <c5>hkj</c5> 
    <a> 
     <b1>SampleB1</b1> 
     <b2> 
      <c1>zyx</c1> 
      <c2>wvu</c2> 
      <c3>tsr</c3> 
     </b2> 
     <b3>SampleB3</b3> 
    </a> 
</root> 
Cuestiones relacionadas