2010-11-03 14 views
14

Non sono sicuro di come funziona la direttiva xsl:sort. Ho bisogno di ordinare gli elementi con il loro nome tag (per diffing), e non riesco a trovare come farlo funzionare. Il mio primo pensiero è stato quello di modificare la trasformazione dell'identità e modificarla semplicemente per includere un'istruzione sort, ma non sono esattamente sicuro di come farlo.XSLT per ordinare i nodi per nome?

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

+0

Si prega di fornire un documento XML di origine piccola e anche il risultato atteso dalla trasformazione. –

+0

Buona domanda, +1. Vedi la mia risposta per una soluzione completa che ordina anche attributi e per un avvertimento. –

risposta

23

Questa trasformazione:

<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> 

se applicato su questo documento XML:

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

produce l'output ordinato voluto:

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

Do atto:

  1. non solo gli elementi, ma anche gli attributi sono ordinati (quest'ultimo è a carico di attuazione, ma funziona bene con MSXML).

  2. L'utilizzo di XML ordinato per diffs non è affidabile, poiché la conversione di un documento XML in una rappresentazione ordinata non è una mappatura 1: 1.

+0

Se la struttura XML è accessibile esclusivamente tramite DOM, perché i documenti ordinati non potrebbero essere diffusi? –

+0

@ Stefan-Kendall: Perché un elemento può avere lo stesso numero di figli con lo stesso nome (nei due documenti) ma in ordine molto diverso in ciascuno dei documenti. Entrambi i documenti saranno trasformati per produrre liste identiche di bambini per questo elemento e l'operazione diff (o solo osservazione personale) non troverà alcuna differenza. –

+0

L'ordine non è garantito nei documenti che sto analizzando comunque, e qualsiasi cosa allo stesso livello è equivalente, quindi penso che questo dovrebbe funzionare. –

Problemi correlati