XSLT 2.0多重分组

6

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

这是源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">

那么我该如何应用两个(或多个)分组呢?
1个回答

14

你需要按照分组一些由这两个字符串组合而成的字符串,例如

<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">
这两种方法的区别在于,在使用 for-each-group 中的 position() 函数时会变得明显。在使用 concat 的情况下,您将获得从1到4的位置值;而在嵌套情况下,您将获得1、2、1、2的值(因为位置由最近的封闭 for-each-group 决定)。同样地,last()concat 情况下是4,在嵌套情况下是2。

1
当然,在这两种情况下,current-grouping-key()的值也是不同的。 - Michael Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接