XSLT/将元素链接到组

XSLT/将元素链接到组,xslt,linker,grouping,Xslt,Linker,Grouping,还有一个XSLT/分组问题,但我找不到这个问题的答案。我知道如何进行Muenichian分组,但我很难将属于该组中任何分组元素的子元素内容链接到父元素分组到的位置 这里的想法是按内容颜色组合对元素进行分组,这样将使用此示例文件生成4种不同的组合。对于这些组,价格在组内一起计算。一些goodslines包含一些附加项,这些附加项需要映射到正确的组中,这就是问题所在 这些额外的行需要作为零行单独读入,并且它们应该有一个数字,该数字链接到XSL生成的组号 我曾尝试创建前面的兄弟来匹配该组,但我只让它工

还有一个XSLT/分组问题,但我找不到这个问题的答案。我知道如何进行Muenichian分组,但我很难将属于该组中任何分组元素的子元素内容链接到父元素分组到的位置

这里的想法是按内容颜色组合对元素进行分组,这样将使用此示例文件生成4种不同的组合。对于这些组,价格在组内一起计算。一些goodslines包含一些附加项,这些附加项需要映射到正确的组中,这就是问题所在

这些额外的行需要作为零行单独读入,并且它们应该有一个数字,该数字链接到XSL生成的组号

我曾尝试创建前面的兄弟来匹配该组,但我只让它工作到原始位置,而不是分组位置

XML示例

<shipment>
    <goodslines>
        <goodsline>
            <content>content1</content>
            <color>color1</color>
            <price>10</price>
            <extras>
                <extra>extra-a</extra>
                <price>5</price>
            </extras>
        </goodsline>
        <goodsline>
            <content>content1</content>
            <color>color1</color>
            <price>10</price>
        </goodsline>
        <goodsline>
            <content>content2</content>
            <color>color1</color>
            <price>20</price>
            <extras>
                <extra>extra-b</extra>
                <price>15</price>
            </extras>
        </goodsline>
        <goodsline>
            <content>content2</content>
            <color>color1</color>
            <price>20</price>
            <extras>
                <extra>extra-c</extra>
                <price>25</price>
            </extras>
        </goodsline>
        <goodsline>
            <content>content2</content>
            <color>color2</color>
            <price>25</price>
        </goodsline>
        <goodsline>
            <content>content3</content>
            <color>color1</color>
            <price>30</price>
        </goodsline>
        <goodsline>
            <content>content3</content>
            <color>color1</color>
            <price>30</price>
        </goodsline>
    </goodslines>
</shipment>
所以,这些额外行的最后一个数字指示了它属于哪个组

现在我得到:

1§content1§20
2§content2§40
3§content2§25
4§content3§60
0§content1§5§extra-a§1
0§content2§15§extra-b§2
0§content2§25§extra-c§3
最后一个出错的地方。最后一行应该属于content2/color1组,就像extra-b一样。通过尝试在不同的goodsline元素之间移动这些额外的行和/或添加它们,或多或少会导致结果失败。我兄弟姐妹的想法有点不对劲,但到底是什么


是的,我只能使用XSLT 1.0,我建议您这样做:

XSLT1.0


这会将不同的组保存到一个变量中,然后对该变量进行两次处理—一次用于组本身,一次用于组的额外部分。这样,您每次通过时都会得到相同的组号。

这就解决了我的问题。非常感谢您的快速回复!:
1§content1§20
2§content2§40
3§content2§25
4§content3§60
0§content1§5§extra-a§1
0§content2§15§extra-b§2
0§content2§25§extra-c§2

where the format is:

GroupNo§Content§GroupPriceSum§

and for extras:

Zero§Content§ExtraPrice§ExtraName§GroupBelongTo
1§content1§20
2§content2§40
3§content2§25
4§content3§60
0§content1§5§extra-a§1
0§content2§15§extra-b§2
0§content2§25§extra-c§3
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="line" match="goodsline" use="concat(content, '|', color)"/>

<xsl:template match="/shipment">
    <!-- distinct elements -->
    <xsl:variable name="groups" select="goodslines/goodsline[generate-id()=generate-id(key('line',concat(content, '|', color)))]"/>
    <!-- goods -->
    <xsl:for-each select="$groups">
        <xsl:value-of select="position()" />
        <xsl:text>§</xsl:text>
        <xsl:value-of select="content"/>
        <xsl:text>§</xsl:text>
        <xsl:value-of select="sum(key('line', concat(content, '|', color))/price)"/>
        <xsl:text>&#xD;</xsl:text>
    </xsl:for-each>
    <!-- extras -->
    <xsl:for-each select="$groups">
        <xsl:variable name="group-number" select="position()" />
        <!-- extras in this group -->
        <xsl:for-each select="key('line', concat(content, '|', color))/extras">
            <xsl:text>0§</xsl:text>
            <xsl:value-of select="../content"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="price"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="extra"/>
            <xsl:text>§</xsl:text>
            <xsl:value-of select="$group-number"/>
            <xsl:text>&#xD;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>