2016-09-07 7 views
2

for-each-groupの反復の順序は同じデータで予測可能ですか?xsl for-each-groupの反復順序は一致していますか?

<xsl:for-each-group 
      select="descendant::FormSectionElements[not(LoadBindBase = '')]" 
      group-by="LoadBindBase"> 

... first ... 

</xsl:for-each-group> 


<xsl:for-each-group 
      select="descendant::FormSectionElements[not(LoadBindBase = '')]" 
      group-by="LoadBindBase"> 

... second ... 

</xsl:for-each-group> 

答えて

2

グループを処理するデフォルトの順序は、「最初の出現順序」です。グループ化キーとしての「ロンドン」の最初の出現が「パリ」の最初の出現に先行する場合、キー「ロンドン」のグループは、キー「パリ」のグループの前で処理されます。 xsl:for-each-groupの子としてxsl:sortを使用して順序を変更することができます。どちらの場合も、命令は命令の複数の使用間で安定しているだけでなく、異なる実装間で予測可能で相互運用可能です。

@ michael.hor257kと同じグループ化を2回行うのは悪い考えであると私は同意できません。まず、マップを使用してXSLT 3.0に移行するまで、グループを保持するための便利なデータ構造はありません。第二に、ここではメモリ時間のトレードオフがありますので、状況によって異なります。

<xsl:variable name="groups" as="map(xs:string, node()*)"> 
    <xsl:map> 
    <xsl:for-each-group 
     select="descendant::FormSectionElements[not(LoadBindBase = '')]"> 
     <xsl:map-entry key="current-grouping-key()" select="current-group()"/> 
    </xsl:for-each-group> 
    </xsl:map> 
</xsl:variable> 

、その後、あなたは、たとえば、使用してグループを反復処理することができます:

3.0にマップでこれを行う方法は次のようになり

<xsl:for-each select="map:keys($groups)"> 
    <group key="{.}"> 
    <xsl:apply-templates select="$groups(.)" mode="xxx"/> 
    </group> 
</xsl:for-each> 

マップの処理の順序: keys()は予測不可能ですが、複数の呼び出しで一貫している必要があります。

1
  1. 群間の順序付けはXSLT 2.0仕様で定義され、そして:同じループが2回実行されている場合、またはそれが私は、このループは、テンプレートの別々の部分に二回繰り返した、例えば、変化する可能性がxsl:sortを使用して明示的に変更しない限り、同じ母集団のxsl:for-each-group命令を呼び出すたびに同じになります。

  2. グループ化操作は高価になる可能性があり、一度だけ実行することをお勧めします。必要に応じて、後で再利用するために、グループ化の結果全体(またはその一部の特性のみをdiscussed in your previous questionというように)を変数に入れることができます。


P.S. http://xyproblem.info/

関連する問題