気の向くままに辿るIT/ICT/IoT
XSLT

【Sorting / 並べ替え・ソート】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLTの並べ替え・ソートって?

【Sorting / 並べ替え・ソート】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0並べ替え・ソートとは

 W3C勧告XSLTバージョンXSLT 2.0の「Sorting / 並べ替え・ソート」

 XSL Transformations (XSLT) Version 2.0 / W3C Recommendation 23 January 2007の目次に沿った日本語訳です。

 当サイト管理人が2009年04月、意訳したものですが、構文解釈の違いや翻訳の違いが含まれるかもしれません。正式文書はW3C 各種仕様書(英語版)である事を予めご了承ください。

<< 12. 連番・番号付け・ナンバリング / Numbering

XSLT 2.0並べ替え・ソート目次


13 並べ替え・ソート / Sorting
 13.1 [ xsl:sort ]要素
  13.1.1 ソート・並べ替え処理
  13.1.2 ソートキー値比較 Comparing Sort Key Values
  13.1.3 照合を利用したソート Sorting Using Collations
 13.2 ソート済みシーケンスの生成 Creating a Sorted Sequence
 13.3 ソート済み順にシーケンスを処理 Processing a Sequence in Sorted Order

13 整列・ソート

[定義:  ソートキー仕様は、ソートしたシーケンスを形成する為の入力シーケンスにあるアイテムのソートにおける規則を一緒に定義する1つ以上の隣り合う xsl:sort 要素のシーケンスです。 ]

[定義:  ソートキー仕様がない場合には、 各xsl:sort 要素は、ソートキーコンポーネントの1つを定義します。 ] 最初の xsl:sort 要素は、ソートキー仕様の第一のコンポーネントを記述し、 次の xsl:sort 要素は、ソートキー仕様の第二のコンポーネントを、次の・・・(つづく)を記述します。

ソートキー仕様は、 xsl:apply-templatesxsl:for-eachxsl:perform-sort 、または、 xsl:for-each-group 要素内ですぐに続いて現れる場合があります。

注釈:

xsl:for-eachxsl:for-each-group 、 または、 xsl:perform-sortxsl:sort 要素の中で利用した際には、いくつかの他の子の前に現れなければいけません。

13.1 xsl:sort 要素

<xsl:sort
  select? = expression
  lang? = { nmtoken }
  order? = { "ascending" | "descending" }
  collation? = { uri }
  stable? = { "yes" | "no" }
  case-order? = { "upper-first" | "lower-first" }
  data-type? = { "text" | "number" | qname-but-not-ncname }>
  <!-- Content: sequence-constructor -->
</xsl:sort>

xsl:sort 要素は、ソートキーコンポーネントを定義します。 ソートキーコンポーネントは、シーケンスがソートされている中で各アイテムにおいてソートキー値がどのように算出されるのか、そしてまた、どのようにして2つのソートキー値が比較されるのかを記述します。

ソートキーコンポーネントの値は、その select 属性、または、含んだシーケンスコンストラクタのいずれかによって決められます。 もし、いずれでもないものが存在する場合には、既定は、 select="." であり、それは、もし、それが、原子化された値上で、または、もし、それがノードであればアイテムの typed-value 上でアイテムの実際の値におけるソートの作用を持ちます。 もし、 select 属性が存在する場合には、その値は、XPath にしなければいけません

[ERR XTSE1015] もし、カラではない内容を持つ select 属性を伴う xsl:sort 要素である場合には、それは、静的エラーです。

値が属性値テンプレートである xsl:sort 要素のそれらの属性は、 含んでいる命令の select 属性を評価する為に利用される時に、同じfocus/フォーカスを利用して評価されます。 (特に、 xsl:apply-templatesxsl:for-eachxsl:for-each-group 、 または、 xsl:perform-sort )。

stable 属性は、 ソートキー仕様にある最初の xsl:sort 要素上に限定して許容されます。

[ERR XTSE1017] もし、 stable 属性を持つ氏族が、 xsl:sort 要素のシーケンスにある最初ではなく、 xsl:sort 要素である場合には、 それは、静的エラーです。

[定義:  ソートキー仕様は、もし、その最初の xsl:sort 要素が、 存在しない stable 属性を持つか、または、有効な値が、 yes である stable 属性を持つ場合には、 共通の目的(stable)になると言われています。 ]

13.1.1 ソート処理

[定義:  ソートされる為のシーケンスは、初期シーケンスとして参照されます。 ]

[定義:  xsl:sort 要素によって定義したようにソートされた後のシーケンスは、ソート済みシーケンスとして参照されます。 ]

[定義:  初期シーケンスにある各アイテムにおいては、 ソートキー仕様にあるソートキーコンポーネントごとに値が算出されます。 N 番目のソートキーコンポーネントを利用する事によるアイテムにおける算出した値は、そのアイテムの N 番目のソートキー値として参照されます。 ]

初期シーケンスにあるアイテムは、 それらのソートキー値を比較する事によるソート済みシーケンスに指示されます。 ソート済みシーケンスにある2つのアイテム AB の相対位置は、次に続くように決められます。 A という最初のソートキー値は、最初のソートキーコンポーネントの規則と一致する B という最初のソートキー値と比較されます。 もし、これらの規則の下で、 A が、 B より小さい場合には、 A は、このソートキーコンポーネントorder 属性が、ソート済みシーケンスにある B が、 A に優先するという descending を記述する場合を除き、ソート済みシーケンスにある B に優先します。 もし、しかしながら、関連するソートキー値比較が等しい場合には、 A という2番目のソートキー値は、2番目のソートキーコンポーネントの規則と一致する B という2番目のソートキー値と比較されます。 これは、2つのソートキー比較が等しくないものが見つけられる間、続きます。 もし、全てのソートキー値比較が等しく且つ、ソートキー仕様が、stableである場合には、 単にもし、初期シーケンスにある A が、 B に優先する場合には、ソート済みシーケンスにある A は、 B に優先するでしょう。 もし、全てのソートキー値比較が等しく、且つソートキー仕様が、stableではない場合には、 ソート済みシーケンスにある AB の関連する命令は、implementation-dependentです。

注釈:

もし、2つのアイテムが、等しいソートキー値を持ち、 且つ、そのソートが、stableである場合には、 ソート済みシーケンスにあるそれらの命令は、 いくつかの、または、 全てのソートキーコンポーネント上に記述された order="descending" かどうかに関わらず、 初期シーケンスにあるそれらの命令と同じになるでしょう。

N 番目のソートキー値は、 select 属性、または、もし、いずれでもないものが存在する場合には、 N番目のxsl:sort 要素の含んだシーケンスコンストラクタ、 または、式 . (dot)のいずれかを評価する事よって算出されます。 この評価は、次に続くようにfocus/フォーカスを伴って行われます。:

注釈:

いくつかの他のXPath式にあるように、 current 関数は、全体としての式における文脈アイテムであるアイテムを参照する為の xsl:sortselect 式の中で利用される場合があります; それは、ソートキー値が算出されていて存在するアイテムです。

ソートキー値は、原子化され、そしてその時比較されます。 それらは、次のセクションで記述したように、それらのデータタイプに依存して比較されます。

13.1.2 ソートキー値を比較する

ソートキーコンポーネントの一部としての投入を含む固有のデータタイプにおける規則を利用して ソートキー値を比較する為にシステムに強制する事が可能となっています。 例えば、 <xsl:sort select="xs:date(@dob)"/> は、日付として比較される為の属性を強制するでしょう。 このような投入の欠如では、ソートキー値は、それらのデータタイプとして妥当な規則を利用して比較されます。 タイプ xs:untypedAtomic のいくつかの値は、 xs:string に投入されます。

XSLT 1.0での後方互換性においては、 data-type 属性は、 そのまま利用可能です。 もし、これが、有効な値 text を持つ場合、 原子化したソートキー値は、比較される前に文字列に変換されます。 もし、それが、有効な値 number を持つ場合には、その原子化したソートキー値は、比較される前に倍精度浮動小数に変換されます。 変換は、 stringFO 、 または、妥当なものとしての numberFO 関数を利用して行われます。 もし、 data-type 属性が、いくつかの他の有効な値を持つ場合には、 値は、カラではない前置詞を伴う語彙的なQNameにしなければならず、 属性の効果は、implementation-definedです。

[ERR XTTE1020] もし、いくつかのソートキー値が、原子化しdata-type 属性によって要求したいくつかのタイプを変換した後、 1つ以上アイテムを含んでいるシーケンスである場合には、その効果は、 xsl:sort 要素が、後方互換性挙動を伴って評価されたかどうかに依存します。 後方互換性挙動を伴う場合には、有効なソートキー値は、シーケンスにある最初のアイテムです。 他のケースでは、これは、タイプエラーです。

(いくつかの変換後の)ソートキー値のセットは、まず、カラ値と基数値、カラ値か基数値という2つのカテゴリに分割されます: カラのソートキー値は、ソートキー値が、カラのシーケンスにある場合には、それらのアイテムを表現します。 これらの値は、他のそれぞれと等しくなるようにソートする目的において考慮されますが、しかし、他の値よりも小さくなります。 そのまま残っている値は、基数として分類されます。

[ERR XTDE1030] もし、いくつかのソートキーコンポーネントにおいて、 いくつかのタイプ変換が要求した後、初期シーケンスにある全てのアイテムについて評価したソートキー値のセットが、 XPath lt 演算子がエラーという結果における基数値のペアを含む場合には、それは、回復されない動的エラーです。

注釈:

上記エラー条件は、もし、命令をサポートしないタイプから成るソートされる為の値である場合、 (例えば、 xs:QName )、または、もし、シーケンスが異なった要素から成っている場合(例えば、もし、文字列と数字両方を含む場合)には、現れる場合があります。 そのエラーは、概して投入を実行する事によって、または、ソートキーコンポーネントにあるコンストラクタ関数によって予防される事が可能です。

エラー条件は、エラーを起こすかどうかを決める為に単独でいくつかの式を評価する事をプロセッサが要求しないありふれた警告の為の項目です。 例えば、もし、いくつかのソートキーコンポーネントがある場合には、プロセッサは、同等である第一ソートキー値と一致する場合を除き、 第二ソートキー値の評価または比較を要求しません。

一般には、2つの基数値の比較は、XPath lt 演算子の規則と一致して実行されます。 lt 演算子という同じ手法である全ての命令における保証は、全ての比較において利用されなければいけません: 選択される1つは、たいていサブタイプ部分文字列とタイプ昇格、サブタイプ部分文字列またはタイプ昇格によって変換される事が出来る全ての値の為のタイプを記述するにふさわしい1つです。 例えば、 もし、シーケンスが、 xs:decimalxs:double 値の両方を含む場合には、 値は、2つの xs:decimal 値を比較する場合でさえ、 xs:double 比較を利用して比較されます。 NaN 値は、ソート目的において、他のそれぞれと等しくなるように考慮され、そしていくつかの他の数値よりも小さくなります。 特別規則はまた、次のセクションで記述したように、 xs:string xs:anyURI タイプにも適用し、タイプは、そこからの制限によって取得します。

13.1.3 照合を利用するソート

このセクションで与えられる規則は、タイプが、xs:string、または、 xs:string からの制限によって派生したタイプ または、タイプが、 xs:anyURI である、または、 xs:anyURI からの制限によって派生したタイプ である値を比較する際に適用します

[定義:  XSLT 2.0 と XPath 2.0における利便性は、照合と名付けた概念によって指定される為の文字列を要求します。 照合は、2つの文字列が等しいかどうか、その他の前にソートされる為にあるそれらで構成されるか、されないかという規則のセットです。 ] 照合は、URIによって識別されますが、実際の規則を伴ってこのURIが結び付けられるマナーか、または、アルゴリズムは、implementation-definedです。

1つの照合URIは、 http://www.w3.org/2005/xpath-functions/collation/codepoint である手法ごとに認識されなければならず、 それは、文字列にある文字列の Unicode codepoint Value を基準とした文字列を比較する為の性能をを提供します。

照合についてのより多くの情報は、[関数と演算子]にあるセクション 7.3 文字列の等価と比較FO参照。 いくつかの仕様は、例えば、[UNICODE TR10]は、適応する事が可能な、または、様々な目的においてパラメータ化させる規則を記述する為の用語 [collation]です。 この仕様では、照合URIは、すでに固定されているこのような全てのパラメータにおいて照合を参照します。 それゆえに、もし、照合URIが記述される場合には、 case-orderlang のような他の属性は、無視されます。

注釈:

XSLTが、照合しているシーケンスを定義する為の詳細メカニズムを提供しない理由は、基礎をなす手法プラットフォームから得る事が可能な照合メカニズムを再利用するであろう手法が多いためです (例えば、オペレーティングシステムから、または、選んだプログラミング言語の実行時ライブラリから)。 これらは、その他の手法の1つであるXSLTとは必然的に異なるでしょう。

もし、 xsl:sort 要素が、 collation 属性を持つ場合には、文字列は、 名前付き照合における規則と一致するものと比較されます。: それは、それらが、XPath 関数呼び出し compare($a、 $b、 $collation) を利用して比較されるという事です。

もし、 xsl:sort という collation 属性の有効な値が、相対URIである場合には、 それは、 xsl:sort 要素の基準URIに対して解決されます。

[ERR XTDE1035] もし、(基準URIに対して解決後に) xsl:sortcollation 属性が、照合を参照するものとしての手法によって認識されるURIでない場合には、 それは、回復されない動的エラーです 。

注釈:

固有の照合URIを認識できるか否かを決める為の手法においてこの上ないものです。 例えば、もし、手法が、URIの一部にあるパラメータを含む為の照合URIを許容し、それは、URIが未知のものを含んでいるかどうか、または、妥当なパラメータかどうか、または、照合URIを認識されないかどうか判断する手法です。 このように回復されない時、このエラーが記述されるという事実は、もし、それをする事を選ぶ場合には、フォールバック(縮退)照合を適用している手法を妨げません。

langcase-order 属性は、もし、 collation 属性が存在する場合には無視されます。 しかし、 collation 属性が欠如する中では、これらの属性は、ふさわしい照合を位置づける為のimplementation-definedアルゴリズムの為に入力を提供します:

  • lang 属性は、固有の自然言語が利用されるべきである点において適する照合を示します。 属性の有効な値は、 xml:lang 属性 (参照先: [XML 1.0])において妥当になるようにしなければいけません

  • case-order 属性は、小文字の前に大文字を、または、逆の場合も同様にソートすべき照合を要求するかどうかを示します。 属性の有効な値は、 lower-first (照合しているシーケンスで小文字が大文字より優先される事を示す)、または、 upper-first (大文字が小文字より優先される事を示す)のいずれかにしなければいけません

もし、 collationlang 、または、 case-order 属性の存在しない構成が存在する場合には、 照合は、implementation-defined方法で選ばれます。 ソートにおける要求しない既定照合は、 5.4.1 静的文脈を初期化する3.6.1 default-collation 属性で記述したように、 XPath式を評価する際に利用したdefault-collationと同じにすべきです。

注釈:

ソート時、強力な照合を利用する事は妥当であり、それは、他のものと等しい文字列間で第2の差異(符号)、第3の差異(状況)のアカウントを取得します。 そのような差異を無視する弱い照合は、等しい文字列を比較する際に、より適したものになる場合があります。

国際的なソートに関する有益なバックグラウンド情報は、[UNICODE TR10]で提供されます。 case-order 属性は、[UNICODE TR10]のセクション 6.6で記述したように解釈される場合があります。

13.2 ソート済みシーケンスを作成する

<!-- カテゴリ: 命令 -->
<xsl:perform-sort
  select? = expression>
  <!-- Content: (xsl:sort+, sequence-constructor) -->
</xsl:perform-sort>

xsl:perform-sort 命令は、ソート済みシーケンスを返すために利用されます。

初期シーケンスは、 select 属性を評価する事によって、または、含んだシーケンスコンストラクタを評価する事によって、(但し、両方ではない、いずれか一方の場合に)含まれます。 もし、存在しない select 属性と存在しないシーケンスコンストラクタがある場合には、初期シーケンス(そしてそれゆえに、ソート済みシーケンス)は、カラのシーケンスです。

[ERR XTSE1040] もし、 select 属性を伴う xsl:perform-sort 命令が、 xsl:sortxsl:fallback 命令ではない、いくつかのコンテンツを持つ場合には、 それは、静的エラーです。

xsl:perform-sort 命令の結果は、その含んだソートキー仕様を利用して その初期シーケンスをソートした結果です。

例:原子化された値のシーケンスをソートする

次に続くスタイルシート関数は、ソートキーとして値それ自身を利用して原子化された値のシーケンスをソートします。

<xsl:function name="local:sort" as="xs:anyAtomicType*">
	<xsl:param name="in" as="xs:anyAtomicType*"/>
	<xsl:perform-sort select="$in">
		<xsl:sort select="."/>
	</xsl:perform-sort>
</xsl:function>

 

例:ソートを実行する為の関数を書く

次に続く例は、価格による本のソートの関数を定義し、安い価格順の5冊を出力する為にこの関数を利用します:

<xsl:function name="bib:books-by-price" as="schema-element(bib:book)*">
	<xsl:param name="in" as="schema-element(bib:book)*"/>
	<xsl:perform-sort select="$in">
		<xsl:sort select="xs:decimal(bib:price)"/>
	</xsl:perform-sort>
</xsl:function>
	 ...
	 <xsl:copy-of select="bib:books-by-price(//bib:book)[position() = 1 to 5]"/>
 

13.3 ソートした命令にあるシーケンスを処理する

xsl:for-each または、 xsl:apply-templates 内で利用した際には、 ソートキー仕様は、 提供したシーケンスの命令ではなく、ソートした命令の中で処理される為にある命令によって選択したアイテムのシーケンスを表示します。

例:ソートした命令にある要素を処理する

例えば、従業員データベースがフォームを持つとしましょう

<employees>
	<employee>
		<name>
			<given>James</given>
			<family>Clark</family>
		</name>
		...
	</employee>
</employees>

その時、名前によってソートした従業員のリストは、(以下を)利用して生成される事が可能となっています:

<xsl:template match="employees">
	<ul>
		<xsl:apply-templates select="employee">
			<xsl:sort select="name/family"/>
			<xsl:sort select="name/given"/>
		</xsl:apply-templates>
	</ul>
</xsl:template>
<xsl:template match="employee">
	<li>
		<xsl:value-of select="name/given"/>
		<xsl:text> </xsl:text>
		<xsl:value-of select="name/family"/>
	</li>
</xsl:template>

xsl:for-each-group 内で利用した際には、 ソートキー仕様は、処理される為にあるグループにおける命令を表示します。 xsl:for-each-group の効果については、14 グループ化参照。

14. グループ化 / Grouping >>


ホーム前へ次へ