Sto provando a canonicalizzare la rappresentazione di alcuni dati XML ordinando gli attributi di ciascun elemento in base al nome (non al valore). L'idea è di mantenere le differenze testuali minime quando gli attributi vengono aggiunti o rimossi e per impedire a editori diversi di introdurre varianti equivalenti. Questi file XML sono sotto il controllo del codice sorgente e gli sviluppatori stanno cercando di diffare le modifiche senza ricorrere a strumenti XML specializzati.Utilizzo di XSL per ordinare gli attributi
Sono stato sorpreso di non trovare un esempio XSL di come questo. Fondamentalmente voglio solo la trasformazione dell'identità con attributi ordinati. Sono venuto con la seguente con sembra funzionare in tutti i miei casi di test:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="*|/|text()|comment()|processing-instruction()">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:sort select="name(.)"/>
<xsl:copy/>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Come n00b XSL totale Gradirei qualsiasi commento sullo stile o l'efficienza. Ho pensato che potrebbe essere utile postarlo qui poiché sembra non essere un esempio comune.
Il trasformatore XSL garantisce che l'ordine specificato per gli attributi è l'ordine scritto? –
Gli strumenti XML non garantiscono che qualsiasi output XML conservi l'ordine degli attributi anche se si tenta di costruirlo come sopra. Ricorda anche che non puoi nemmeno garantire quale simbolo viene usato per quotare i valori. Il confronto lessicale di XML è in genere una cattiva idea. –