並べ替えのメカニズム

www.altova.com すべてを展開/折りたたむ このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  SPS ファイル: 高度な機能 > 並べ替え >

並べ替えのメカニズム

要素のノードに対して並べ替えを行うには、2つのステップを踏む必要があります:

 

 

1.デザインビューにて、並べ替えの対象となる要素ノードを選択します。XML ドキュメント内にあるこの要素のインスタンスが並べ替えられることになります。場合によってはどの要素が並べ替えの対象となるのか、すぐには分からないこともあります。例として以下のスクリーンショットに示される構造を考えてみましょう。

 

SS_sort_elementselect

 

newsitem には、place 要素を含む dateline 要素が含まれており、place 要素には city 属性が含まれています。全 newsitem 要素以下にある @city ノードをアルファベット順に出力する場合を考えてみましょう。デザインでは、@city ノード(または placedatelinenewsitem 要素)を並べ替えの対象に選択するのでしょうか?@city が選択されると、1つの city ノードだけが並べ替えの対象となります。place または dateline が選択された場合でも、これらの要素は親ノード内に1度しか出現しないため、並べ替えは1つのノードに対してしか行われません。これに対して newsitem が選択された場合、親要素の newsitems 以下に複数の newsitem 要素が出現するため、newsitem に対して並べ替えを行うことになります。

2.並べ替えを行う要素を選択した後には、その要素を右クリックすることで表示されるコンテキストメニューから並べ替えコマンドを選択します。出力ソートの順序を定義ダイアログが表示され、並べ替えの内容を入力することができます(以下のスクリーンショットを参照)。

 

DlgDefineSortOrderGen

 

各並べ替えの設定内容には、(i) ソートキー(マッチカラムにて入力)、(ii) 並べ替えに使用されるソートキーのデータ型(テキストまたは数値)、そして (iii) 並べ替えの順序(昇順または降順)が用意されています。このダイアログに表示される設定内容の順序は重要な意味を持ちます。複数のアイテムが同じ値を持っている場合、並べ替えは最初の行にある条件から最後の行まで順に行われます。並べ替えに使用する条件の数に制限はありません。

 

並べ替えが使用される例については、次を参照してください: サンプル: 複数のソートキーによる並べ替え.

 

ユーザー定義テンプレート

ユーザー定義テンプレート を使用することで、指定した XPath 条件式により選択されるアイテムに対してテンプレートを適用することができます。XPath 条件式により選択されたノードを並べ替えることもでき、この場合、並べ替えはユーザー定義テンプレートに対して適用されます。

 

ソートキーに関するメモ

入力された XPath 条件式により選択されるソートキーは単一のノードでなければならず、ノードセット (XPath 1.0) やシーケンスアイテム (XPath 2.0 と XPath 3.0) とすることはできません。各要素のキーは、文字列または数値の値に対して解決可能である必要があります。

 

XSLT 2.0 または 3.0 の SPS にてノードのシーケンスがソートキーに対して得られた場合、エラーが XSLT プロセッサーにより返されます。上記の Person サンプルの場合、../Person/LastName という XPath 条件式では、Person の親要素に含まれている全ての LastName 要素が返されるため、エラーが返されます(複数の Person 要素が存在する場合)。Person をコンテキストノードとする正しい XPath 条件式は、LastName となります(各 Person 要素には1つの LastName ノードしか存在しないため)。

 

XSLT 1.0 では、ソートキーのセレクターによりノードセットが得られた場合、最初のノードにあるテキスト値が使用されます。ソートキーに対して XPath 条件式により複数のノードが選択された場合でも、StyleVision によりエラーが返されることはなく、最初のノードにあるテキストが使用されます。しかし、最初に選択されたノードが目的のソートキーではない場合もあります。例えば、上に挙げた ../Person/LastName XPath 条件式によりエラーが返されることはありませんが、各要素に対して同じ値(最初の LastName ノードにあるテキスト値)が使用されるため、並べ替えが行われることもありません。この場合、location/@* という形式の条件式を使用することにより、location 子要素にある最初の属性がソートキーとして使用され、並べ替えが行われることになりますが、このような条件式の使用は推奨されておらず、より正確な(単一のノードを選択する)条件式の記述が推奨されます。

 

 

 


(C) 2019 Altova GmbH