Próbuję kanonicznie reprezentować niektóre dane XML, sortując atrybuty każdego elementu według nazwy (nie wartości). Chodzi o to, aby różnice tekstowe były minimalne, gdy dodawano lub usuwano atrybuty oraz aby różne edytory nie wprowadzały równoważnych wariantów. Te pliki XML są pod kontrolą źródła, a programiści chcą różnicować zmiany bez uciekania się do specjalistycznych narzędzi XML.Używanie XSL do sortowania atrybutów
Byłem zaskoczony nie znaleźć przykład XSL, jak to zrobić. Zasadniczo chcę tylko transformację tożsamości z posortowanymi atrybutami. Wpadłem z następujących wydaje się działać we wszystkich moich testów:
<?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>
Jako łącznej XSL n00b Byłbym wdzięczny za wszelkie komentarze na temat stylu i wydajności. Pomyślałem, że może to być pomocne, aby opublikować go tutaj, ponieważ wydaje się, że nie jest to typowy przykład.
Czy transformator XSL gwarantuje, że kolejność określona dla atrybutów jest zgodna z zamówieniem? –
Narzędzia XML nie mają gwarancji, że dane wyjściowe XML zachowują kolejność atrybutów, nawet jeśli spróbujesz zbudować to jak wyżej. Pamiętaj także, że nie możesz nawet zagwarantować, który symbol jest używany do cytowania wartości. Lekkie porównanie XML jest zwykle kiepskim pomysłem. –