2009-09-15 11 views
10

各要素の属性を名前(値ではなく)で並べ替えて、XMLデータの表現を正規化しようとしています。アイデアは、属性が追加または削除されたときにテキストの違いを最小限に抑え、異なるエディタが同等のバリアントを導入しないようにすることです。これらのXMLファイルはソース管理下にあり、開発者は特殊なXMLツールに頼らずに変更を比較したいと考えています。XSLを使用して属性を並べ替える

私は驚いたではありませんどのようにこれのXSLの例を見つける。基本的には、ソートされた属性を持つ恒等変換だけが必要です。私はすべてのテストケースで動作しているようで、次のを思い付いた:総XSLのN00Bとして

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

私はスタイルや効率に任意のコメントをいただければ幸いです。少なくとも一般的な例ではないようだから、ここに投稿すると便利かもしれないと思った。

答えて

11

xsltはfor-eachを実行する関数型言語であるため、人間にとっては最も簡単な方法ですが、XSLTプロセッサでは最も効率的ではないため、呼び出しを完全に最適化できません。

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

これは、しかしみなし、「XSLのN00B」と私はあなたが実際に非常によく問題を解決すると思います。この中には全く自明です。

2

問題を解決するためによくできました。 XMLパーザーでは順序や属性が重要ではないことがわかっているので、この演習の主な利点は人間にとってです。機械は予測できない方法で入力や出力を並べ替えます。

XMLの正規化は自明ではなく、独自のXMLツールキットで提供される正規化ツールを使用することをお勧めします。

+0

XSLトランスフォーマでは、属性に指定した順序が書き出された順序であることを保証しますか? –

+3

XMLツールでは、上記のようにXML出力を構成しようとしても、XML出力で属性の順序が保持されるという保証はありません。また、値を引用するために使用されるシンボルを保証することさえできないことを覚えておいてください。 XMLの語彙比較は、通常、あまり考えられません。 –

関連する問題