5

我的问题:如何应用双重(或多重)分组?

这是源 XML:

<?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

1 回答 1

12

你会得到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()如果您在主体中使用函数,这两种方法之间的区别是显而易见的for-each-group- 在这种concat情况下您将获得从 1 到 4 的位置值,在嵌套情况下您将获得 1、2、1、2(因为由最近的封闭)position()确定。同样,将是 4 在这种情况下和 2 在嵌套情况下。for-each-grouplast()concat

于 2013-10-30T10:55:56.660 回答