複数の属性の値をソートするXSLT

XML形式の膨大な構成ファイルがあります。システムはタグの順序を気にしませんが、私たちは人間です! (主にバージョンを比較する目的で)既に受信した XSLTはうまく機能していますが、それだけでは十分ではありません。



  
    
    
      
    
  


I want to sort all tags recursively by the value of their name attribute (this works!) but because the attribute is not always present, it must also sort by further attributes, any of which may or may not be present in any given element.

私は基本的にXSLTを理解していないので、私は実験しています。私はこれに上記をハッキングしましたが、望むように動作しません。この結果は上記と同じです。



  
    
    
      
      
      
      
      
    
  


私のデータはこれと似ていますが、 cell 要素は grid コード>属性。これは、 name 属性を使用するようにソートロジックを拡張したいのであれば、 tabindex のような追加属性を使用してソートを行う必要があります。任意のグループ内で、同じ属性が存在すると見なすことができます。


  
... ...

Update:
With Vincent's very good help, I've created a sorting that works well enough for our purposes. Here it is.

7
良い質問、+1。あなたはより良い、より一般的な並べ替えを持つことに興味があるかもしれません。
追加された 著者 Dimitre Novatchev,
どのようなパーサを使用していますか? Saxon 9.1bでそれを実行すると、私と一緒にうまく動作します。セルは期待どおりにソートされます。
追加された 著者 grtjn,
関連する問題のドロップボックス・リンクの下で使用可能なサンプル入力には、行、列、シーケンス、およびtabindex属性は含まれていません。更新されたサンプルを追加できますか?
追加された 著者 grtjn,
Dropboxのリンクを削除することができます(404エラー)
追加された 著者 Pieter Vandenheede,
@PieterVandenheede気づいてくれてありがとう!私は最近、Dropboxからいくつかのファイルを移動しました。ダウンロードはもう一度利用可能です!
追加された 著者 Torben Gundtofte-Bruun,
@ grtjn:あなたがコメントを書いている間、私はすでに質問を編集していました:-)
追加された 著者 Torben Gundtofte-Bruun,

3 答え

これは、データに混在したコンテンツがないことを前提とした応答です。最初の2つのステップ(@nameと@col)だけを考慮に入れると、それ以降のステップに対応することができます。たぶん、あなたのソートパラメータのリストを入力として受け取る再帰的な名前付きテンプレートで書き直すことができます。私のXSLTがあなたに適していない場合は、XMLサンプルを提供できますか?

XSLT 2.0サンプル:

<?xml version="1.0" encoding="UTF-8"?>

        
            
                
                
                    
                    
                        
                        
                    
                
            
        

同じ値を持つグループに対してコードが反復処理されるため、要素に属性が存在しない場合、要素はグループ化されます。

私は次のXMLを入力します:

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
    
    
    
    
    
    
    
    
        

私は次の結果を持っています:

<?xml version="1.0" encoding="UTF-8"?>

   
   
   
   
   
   
   
           
   
   
   
   

4
追加された
私はあなたのXMLを見て、私はそれぞれの異なる要素(パラメータ、セクション、セル...)は、常に存在する同じ属性を持っているのだろうか?要素名ごとに異なる種類のソートがあるかもしれませんが、それは一般的なタスクよりもはるかに簡単です。
追加された 著者 Vincent Biragnet,
しかし、あなたは、さまざまな属性のために多くの不必要な埋め込みを持つでしょう。
追加された 著者 Vincent Biragnet,
出力をもっと分かりやすくするために、スタイルシートの最初の子として次の命令を追加してください:あなたは上記のインデントされた結果と同じになります。そしてコマンドラインから実行してみてください:java -jar saxon.jar test.xml test.xsl。あなたが出力として得たものについて私に教えてください。
追加された 著者 Vincent Biragnet,
属性:XMLは異なるブロックを持ち、各ブロック内に 内に属性は同じですが、ブロックによって異なります。例えば。 grid ブロック内のすべての要素は同じ種類の属性(row/col/tabindex)を持ちますが、 parameters ブロック(name)の要素とは異なります。問題は50種類以上のブロックがあることです。一般的なソリューションは50以上の個々のルールを設定するよりも優れています。
追加された 著者 Torben Gundtofte-Bruun,
インデント:インデントトリックが助けになりました。私はHTML Tidyも使用していましたが、それは問題を引き起こしますが、インデントを使用するだけで完璧なものになると思います。
追加された 著者 Torben Gundtofte-Bruun,
あなたが言及した出力は、私がそれを望むように正確に見えます!残念ながら、サンプル入力をサンプルXSLTで実行すると、サンプル出力が得られません。 私はこれを手に入れます。私は私の側で最初にトラブルシューティングをする必要があるように見えます!
追加された 著者 Torben Gundtofte-Bruun,

Here is a generic, simple and not long (60 well-formatted lines) solution.

Sorting is performed on all wanted attributes and this doesn't require any manual duplication of templates:


    

    
      
      
      
      
      
    

 
  
    
    
     
    
  
 

 
  

  
      
       
      
  

  
 

 
  

  

  

   

   
       
    

   
 

When this transformation is applied on this xml document:


    
    
    
    
    
    
    
    
    
    
    
    
    
    

the wanted, correctly sorted result is produced:


   
   
   
   
   
   
   
   
   
   
   
   
   
   

Do note:

    すべての 外部パラメータで指定された属性 $ pSortTypes )で並べ替えが実行されます。これを @name @row でのみソートし、注文とソートのデータ型をハードコードする必要がある現在受け入れられている回答と比較してください。

  1. 正確な属性のソート順を指定できます $ pSortTypes のような順序です。

  2. $ pSortTypes type 属性で、各属性のソートデータ型を指定します(現在は "alpha" "numeric"

  3. $ pSortTypes maxLength 属性として、属性値の文字列表現の最大長を指定します。これは正しいパディング/アラインメントに使用され、ソート効率も向上します。

  4. xsl:function (この場合は my:OrderedAttributeTuple )を使用して、最も複雑なソートの問題を解決する方法を示します。 ())。

1
追加された
それで、自分でそれを理解しました。あなたのコードに xsl:sort という要素があるので、そこに order 属性を置くだけです。
追加された 著者 Jagger,
こんにちはDimitre、素敵な作品。 xsl:sort 要素のような order 属性( ascending | descending )を追加する可能性はありますか?
追加された 著者 Jagger,
このソリューションは、XSLT 1.0 + exslt:node-set()拡張関数に変換できます
追加された 著者 Dimitre Novatchev,
@ジャガー、必要ならば、 のソート属性を指定できます。これは現在の問題では必要ではありませんでした。
追加された 著者 Dimitre Novatchev,
xslt 1.0の汎用ソリューションはありますか?
追加された 著者 jechaviz,

与えられた必須属性を持つ非一貫性のある要素に対して、このXSLTを検討してください。

   <?xml version="1.0" encoding="UTF-8"?>

    
    
        
            
            
                
            
        
    
    
        
            
            
                
                
                    
                    
                
            
        
    

私の例では、*と一致する最初のテンプレートでセクションとパラメータをソートする必要があります。また、行と列によるグリッドソート。 テンプレートを複製することによって、異なるソート属性を持つ任意の要素に対して拡張できます。

同じ属性に対して複数の要素がある場合は、 match = "elt1 | elt2 | elt3" を使用します。

1
追加された