2009-09-15 14 views
10

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.

Odpowiedz

11

Xslt to język funkcjonalny, który może być dla nas najłatwiejszy, ale nie jest najskuteczniejszy dla procesorów XSLT, ponieważ nie może w pełni zoptymalizować połączenia.

<?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="*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"> 
     <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*|comment()|processing-instruction()"> 
    <xsl:copy />  
    </xsl:template> 
</xsl:stylesheet> 

To zupełnie trywialne w tym chodzi i choć jako „XSL n00b” Myślę, że rozwiązał problem bardzo dobrze.

2

Dobra robota do rozwiązania problemu. Zakładam, że wiesz, że kolejność lub atrybuty nie mają znaczenia dla parserów XML, więc podstawową zaletą tego ćwiczenia jest dla ludzi - maszyna będzie je porządkowała na wejściu lub wyjściu w nieprzewidywalny sposób.

Kanonizacja w XML nie jest trywialna i zaleca się korzystanie z canonicalizera dostarczonego z jakimkolwiek rozsądnym zestawem narzędzi XML zamiast pisania własnego.

+0

Czy transformator XSL gwarantuje, że kolejność określona dla atrybutów jest zgodna z zamówieniem? –

+3

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