2013-10-30 50 views
1

这里是源XMLXSLT 2.0多重分组

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<root> 
    <row> 
     <Type>1</Type> 
     <WeaNr>100519</WeaNr> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100519</WeaNr> 
     <ETADC_SKU>2007925</ETADC_SKU> 
     <CrossDock>N</CrossDock> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100519</WeaNr> 
     <ETADC_SKU>12007925</ETADC_SKU> 
     <CrossDock>N</CrossDock> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100519</WeaNr> 
     <ETADC_SKU>200792ww5</ETADC_SKU> 
     <CrossDock>Y</CrossDock> 
    </row> 
    <row> 
     <Type>1</Type> 
     <WeaNr>100520</WeaNr> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100520</WeaNr> 
     <ETADC_SKU>2007925444</ETADC_SKU> 
     <CrossDock>N</CrossDock> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100520</WeaNr> 
     <ETADC_SKU>2007925333</ETADC_SKU> 
     <CrossDock>Y</CrossDock> 
    </row> 
    <row> 
     <Type>2</Type> 
     <WeaNr>100520</WeaNr> 
     <ETADC_SKU>204445333</ETADC_SKU> 
     <CrossDock>Y</CrossDock> 
    </row> 
</root> 

我想使用由WeaNrCrossDock

例如,在这种情况下,分组我将有4组:

1. WeaNr=100519 and CrossDock=N 
2. WeaNr=100519 and CrossDock=Y 
3. WeaNr=100520 and CrossDock=N 
4. WeaNr=100520 and CrossDock=Y 

分组就像WeaNr一样简单:

<xsl:for-each-group select="row" group-by="WeaNr"> 

,但我不知道如何使双分组

回答

4

你会group-by一些字符串,它是两者的组合,例如

<xsl:for-each-group select="row" group-by="concat(WeaNr, '|', CrossDock)"> 

或选择使用的for-each-group

两个嵌套层次
<xsl:for-each-group select="row" group-by="WeaNr"> 
    <xsl:for-each-group select="current-group()" group-by="CrossDock"> 

如果您在的主体中使用position()函数,则这两种方法之间的区别很明显- 在concat情况下,你将得到的位置值从1到4,在巢式病例你将得到1,2,1,2(因为position()最近包围for-each-group测定)。类似地,last()将在concat的情况下为4,在嵌套情况下为2。

+1

另外,当然,current-grouping-key()在两种情况下会有所不同。 –