xsl:for-each-groupとその使用方法の詳細な説明が必要だと思います。これがあなたが求めているものではない場合は、私に知らせてください。
XSLT 2.0の新機能であるこの命令は、一連の項目を受け取り、それらをグループ化します。アイテムのセットは「人口」と呼ばれ、グループは単にグループと呼ばれます。命令は各グループを順番に処理します。
xsl:for-each-group命令の可能な属性は次のとおりです。
- 選択する
- group-by
- グループ隣接
- group-starting-with
- グループ終了-with
- 照合
@selectは必須です。その他はオプションです。xsl:sortの子はいくつでも取ることができ(ただし、最初に来る必要があります)、その後にシーケンスコンストラクターが続きます。「シーケンスコンストラクタ」とは、テンプレートなどの内部にあるすべてのシーケンス放出型命令の用語です。
@選択する
select属性は、グループ化される母集団に評価されるXPATH式を指定します。
@ group-by
group-by属性は、グループ化のタイプが共通の値による場合に使用するXPATH式を指定します。他のアイテムと同じgroup-by値に評価される母集団内のすべてのアイテムは、他のアイテムと同じグループにあります。
XSLT 1.0 Muenchianのグループ化は、グループ化のタイプが共通の値でグループ化されている場合はそれほど難しくありません。グループ化には、さらに2つの一般的な形式があります。隣接するアイテムを同様の値でグループ化します。そして、そのグループがいくつかのテストによって最後または最初に区切られているアイテムの隣接するグループをグループ化します。Muenchianを使用すると、これらの両方の形式のグループ化が可能ですが、比較的複雑になります。これらのタイプのMuenchianは、兄弟軸を使用しているため、スケールの効率も低下します(ただし、それを綴ります!)。
頭に浮かぶXSLT2.0のもう1つの利点は、Muenchianがノードセットでのみ機能するのに対し、xsl:for-each-groupは、ノードだけでなく一連のアイテムで機能するため、アプリケーションが広くなることです。
@ group-by式の結果は、一連のアイテムになります。このシーケンスはアトマイズされ、重複排除されます。テストされる母集団アイテムは、値ごとに1つのグループのメンバーになります。@ group-byを使用すると、itemが複数のグループのメンバーになるか、まったくメンバーにならない可能性があるというのは奇妙な結果です。XSLT 2.0でできることは何でも、XSLT 1.0でできることは、曲がりくねった道でできると思いますが、アイテムを2つのグループに分類する機能は、XSLT1.0Muenchianでは簡単に行うことができます。
@group-隣接
group-by、group-adjacent、group-starting-with、およびgroup-ending-withの属性は、異なる種類のグループ化を指定するため、相互に排他的です。コモンズ値を持ち、母集団内で隣接するアイテムはグループ化されます。@ group-byとは異なり、@ group-adjacentは、アトマイズ後に単一のアトミック値に評価される必要があります。
group-starting-with
select、group-adjacent、group-byとは異なり、この属性はXPATH select式ではなくパターンを指定します。これは、xsl:template /@matchが選択ではなくパターンを指定するのと同じ方法です。母集団内のアイテムがパターンテストに合格するか、母集団内の最初のアイテムである場合、新しいグループが開始されます。それ以外の場合、アイテムは前のアイテムからグループを継続します。
Martinは、仕様の例(w3.org/TR/xslt20/#grouping-example)について言及しました。その参照から、「最初の要素によるグループの識別」というタイトルの例をコピーしますが、母集団の最初の項目に関するポイントを強調するために少し変更します。
これが入力ドキュメントです(w3仕様からコピーされました。孤立した行を含めるのは私のものです)...
<body>
<p>This is an orphaned paragraph.</p>
<h2>Introduction</h2>
<p>XSLT is used to write stylesheets.</p>
<p>XQuery is used to query XML databases.</p>
<h2>What is a stylesheet?</h2>
<p>A stylesheet is an XML document used to define a transformation.</p>
<p>Stylesheets may be written in XSLT.</p>
<p>XSLT 2.0 introduces new grouping constructs.</p>
</body>
...私たちがやりたいのは、グループをh2で始まるノードとして定義し、次のh2までの次のすべてのpを含めることです。w3によって与えられる解決策の例は、@group-starting-with..を使用することです。
<xsl:template match="body">
<chapter>
<xsl:for-each-group select="*" group-starting-with="h2" >
<section title="{self::h2}">
<xsl:for-each select="current-group()[self::p]">
<para><xsl:value-of select="."/></para>
</xsl:for-each>
</section>
</xsl:for-each-group>
</chapter>
</xsl:template>
仕様の例では、入力に孤立した線が含まれていない場合、これにより目的の結果が生成されます...
<chapter>
<section title="Introduction">
<para>XSLT is used to write stylesheets.</para>
<para>XQuery is used to query XML databases.</para>
</section>
<section title="What is a stylesheet?">
<para>A stylesheet is an XML document used to define a transformation.</para>
<para>Stylesheets may be written in XSLT.</para>
<para>XSLT 2.0 introduces new grouping constructs.</para>
</section>
</chapter>
私たちの特定のケースでは代わりに取得しますが...
<chapter>
<section title="">
<para>This is an orphaned paragraph.</para>
</section>
<section title="Introduction">
<para>XSLT is used to write stylesheets.</para>
<para>XQuery is used to query XML databases.</para>
</section>
<section title="What is a stylesheet?">
<para>A stylesheet is an XML document used to define a transformation.</para>
<para>Stylesheets may be written in XSLT.</para>
<para>XSLT 2.0 introduces new grouping constructs.</para>
</section>
</chapter>
孤立した回線の最初のセクションが望ましくない場合は、簡単な解決策があります。今は入りません。私のポイントは、@group-starting-withの結果である最初のグループが「孤立した」グループになる可能性があるという事実を強調することです。「孤立」とは、ヘッドノードが指定されたパターンに適合しないグループを意味します。
@照合
collation属性は、照合URIを指定し、文字列が等しいかどうかを比較するために使用される照合を識別します。
current-group()
xsl:for-each-group内で、current-group()関数は、処理中の現在のグループを一連の項目として返します。
current-grouping-key()
xsl:for-each-group内で、current-group()関数は現在のグループキーを返します。よくわかりませんが、これはアトミックタイプにしかなり得ないと思います。また、確かではありませんが、この関数は@group-byおよび@group-adjacentタイプのグループ化にのみ適用できると思います。
@group-byと@group-adjacent
一部のシナリオでは、これら2つのソートタイプから選択して、同じ機能結果を得ることができます。この場合、@ group-adjacentが@group-byよりも優先されます。これは、処理がより効率的になる可能性があるためです。
パターンと選択
一部のXSLT2.0命令属性には、選択式が含まれています。Michael Kayは、これらを「XPath式」と呼んでいます。個人的には、パターンと並べるときは「表現を選ぶ」の方がいいと思います。他の属性には、パターンまたは「一致式」が含まれます。これら2つには同じ構文が含まれていますが、それらは非常に異なる獣です。2つの類似性により、XSLTの初心者は、xsl:template / @ matchをパターンとしてではなく、選択式として考えることがよくあります。その結果、テンプレートのシーケンスコンストラクター内のposition()関数の値について、初心者から多くの混乱が生じています。前述のように、xsl:for-each-groupでは、@ select、@ group-by、および@ group-adjacentはselect式ですが、@group-starting-withおよび@group-ending-withはパターンです。違いは次のとおりです。
- 選択式は関数のようなものです。入力は、コンテキストドキュメント、コンテキストシーケンス、コンテキストアイテム、コンテキスト位置、そしてもちろん実際の式です。出力は一連のアイテムです。これが実際に使用される場所によっては、これが次のコンテキストシーケンスになる可能性があります。デフォルトの軸は子です::。
- select式とは異なり、パターンのデフォルトの軸はself::です。パターンも関数のようなものです。その入力は以前と同じであり、その出力はシーケンスではなくブール値です。いくつかのアイテムは、それがパターンと一致するかどうかを確認するためにテストされています。テストされるアイテムはコンテキストアイテムになります。一致式は、選択式であるため、一時的に評価されます。次に、返されたシーケンスがテストされ、コンテキストアイテムがメンバーであるかどうかが確認されます。返されたシーケンスは破棄されます。結果は、メンバーの場合はtrueまたは「match」であり、それ以外の場合はfalseです。