2010-11-03 35 views
14

No estoy seguro de cómo funciona la directiva xsl:sort. Necesito ordenar elementos por su nombre de etiqueta (para diferir), y parece que no se me ocurre cómo hacer que esto funcione. Lo primero que hice fue modificar la transformación de identidad y simplemente modificarla para incluir una declaración de clasificación, pero no estoy exactamente seguro de cómo hacerlo.XSLT para clasificar nodos por nombre?

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

+0

Proporcione un documento XML de origen pequeño y también el resultado esperado de la transformación. –

+0

Buena pregunta, +1. Vea mi respuesta para una solución completa que también ordena los atributos y para una advertencia. –

Respuesta

23

Esta transformación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

    <xsl:apply-templates select="node()"> 
    <xsl:sort select="name()"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en este documento XML:

<t b="x" c="y" a="t"> 
    <c/> 
    <b/> 
    <a/> 
</t> 

produce la salida ordenada querido:

<t a="t" b="x" c="y"> 
    <a></a> 
    <b></b> 
    <c></c> 
</t> 

Ten en cuenta:

  1. no sólo los elementos, sino también los atributos se clasifican (este último es dependiente de la implementación, pero funciona bien con MSXML).

  2. El uso de XML clasificado para diffs no es confiable, porque la conversión de un documento XML a una representación ordenada no es una asignación 1: 1.

+0

Si solo se accede a la estructura XML a través de DOM, ¿por qué los documentos ordenados no podrían diferirse? –

+0

@ Stefan-Kendall: Porque un elemento puede tener el mismo número de hijos con nombres idénticos (en los dos documentos) pero en orden muy diferente en cada uno de los documentos. Ambos documentos se transformarán para producir listas idénticas de niños para este elemento y la operación de diferencia (o simplemente observación personal) no encontrará ninguna diferencia. –

+0

El pedido no está garantizado en los documentos que estoy analizando de todos modos, y cualquier cosa en el mismo nivel es equivalente, así que supongo que esto debería funcionar. –

Cuestiones relacionadas