4

だから私は次のような入力があります:

<Root>
 <Item id="1" group="foo" />
 <Item id="2" group="bar" />
 <Item id="3" />
</Root>

そして、次のようなテンプレート命令:

<xsl:for-each-group select="Root" group-by="@group" />

fooとのグループしか取得できないようですbar。(なぜですか? で 3 番目のグループを取得できると思っていましたcurrent-group-key() = '')。

私は本当にその第3グループが欲しいです。どのようなオプションがありますか?

ありがとう、デビッド。

4

2 に答える 2

3

マーティンは良い説明をしました。

必要なものが許可されている場合、属性をまったく持たない要素は、group属性を持つ要素と同じグループになりgroup=''ます。これは正確ではありません。

最も簡単な解決策は、属性が存在するgroup-byかどうかgroupは問題ではないことを属性で示すことです。

これを行う最も簡単な方法は次のとおりです。

<xsl:for-each-group select="Root/*" group-by="string(@group)">

完全な変換は次のとおりです。

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:for-each-group select="Root/*" group-by="string(@group)">
   "<xsl:sequence select="string(@group)"/>"
  </xsl:for-each-group>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Root>
    <Item id="1" group="foo" />
    <Item id="2" group="bar" />
    <Item id="3" />
</Root>

必要な結果が生成されます:

   "foo"

   "bar"

   ""
于 2012-10-28T14:32:01.423 に答える
1

XSLT 2.0 仕様http://www.w3.org/TR/xslt20/#xsl-for-each-groupは、 について次のように述べていますgroup-by

group-by 属性が存在する場合、母集団内の項目が母集団順に調べられます。項目 J ごとに、group-by 属性の式が評価され、0 個以上のグループ化キー値のシーケンスが生成されます。これらのグループ化キーのそれぞれについて、そのグループ化キー値を持つアイテムを保持するために作成されたグループが既に存在する場合、J がそのグループに追加されます。それ以外の場合、そのグループ化キー値を持つ項目に対して新しいグループが作成され、J がその最初のメンバーになります。

したがって、母集団内の項目は、0、1、または多数のグループに割り当てられます。

したがって、group-by@groupが3番目のItem要素に対して評価されると、空のシーケンスに評価されるため、アイテムがグループに追加されるグループ化キーが見つかりません。そうすれば、3番目Itemはどのグループにも属しません。

于 2012-10-28T10:24:44.330 に答える