Xml XSLT 1.0嵌套分组、总和和计数

Xml XSLT 1.0嵌套分组、总和和计数,xml,xslt,xslt-grouping,Xml,Xslt,Xslt Grouping,在XSLT1.0中,需要按地址分组,然后按部分和全部分组。当前,如果第一个地址元素中未包含该部分,则忽略该部分。这是很新的 输出为- Total Units 7 name1address1 part1 Total Pallets : 1 part2 Total Pallets : 2 name2address2 part1 Total Pallets : 2 part2 Total Pallets : 1 应为-注意地址2中的第3部分 Total Units 7 name1address

在XSLT1.0中,需要按地址分组,然后按部分和全部分组。当前,如果第一个地址元素中未包含该部分,则忽略该部分。这是很新的

输出为-

Total Units 7

name1address1
part1 Total Pallets : 1
part2 Total Pallets : 2

name2address2
part1 Total Pallets : 2
part2 Total Pallets : 1
应为-注意地址2中的第3部分

Total Units 7

name1address1
part1 Total Pallets : 1
part2 Total Pallets : 2

name2address2
part1 Total Pallets : 2
part2 Total Pallets : 1
part3 Total Pallets : 1
XML是-

<?xml version="1.0" encoding="UTF-8"?>
<dispatch>
    <delivery>
        <name>name2</name>
        <address>address2</address>
        <pallet>
            <part>part1</part>
        </pallet>
        <pallet>
            <part>part2</part>
        </pallet>
    </delivery>
    <delivery>
        <name>name1</name>
        <address>address1</address>
        <pallet>
            <part>part1</part>
        </pallet>
        <pallet>
            <part>part2</part>
        </pallet>
        <pallet>
            <part>part2</part>
        </pallet>
    </delivery>
    <delivery>
        <name>name2</name>
        <address>address2</address>
        <pallet>
            <part>part1</part>
        </pallet>
        <pallet>
            <part>part3</part>
        </pallet>
    </delivery>
</dispatch>
XSLT是-

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

    <xsl:key name="delivery_detail" match="delivery" use="concat(name,address)"/>
    <xsl:key name="delivery_detail_part" match="pallet" use="concat(../name,../address,part)"/>


    <xsl:template match="dispatch">
        <xsl:variable name="total_units" select="count(delivery/pallet)"/>
        <value>Total Units </value>
        <xsl:value-of select="$total_units"/>
        <br/>

        <xsl:apply-templates
            select="delivery[generate-id(.)=generate-id(key('delivery_detail',concat(name,address))[1])]">
            <xsl:with-param name="total_units" select="$total_units"/>
            <xsl:sort select="name"/>
            <xsl:sort select="address"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="delivery">
        <br/>
        <xsl:value-of select="name"/>
        <xsl:value-of select="address"/>
        <br/>
        <xsl:apply-templates
            select="pallet[generate-id(.)=generate-id(key('delivery_detail_part',concat(../name,../address,part))[1])]"
        > </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="pallet">
        <xsl:value-of select="part"/>
        <xsl:variable name="total_pallets"
            select="count(key('delivery_detail_part', concat(../name,../address,part)))"/>
        <value> Total Pallets : <xsl:value-of select="$total_pallets"/></value>
        <br/>
    </xsl:template>

</xsl:stylesheet>

您仅将托盘模板应用于名称/地址组中第一次交货的子项。尝试更改此选项:

<xsl:apply-templates
    select="pallet[generate-id(.)=generate-id(key('delivery_detail_part',concat(../name,../address,part))[1])]"> 
</xsl:apply-templates>
致:

<xsl:apply-templates
    select="key('delivery_detail', concat(name, address))/pallet[generate-id(.)=generate-id(key('delivery_detail_part',concat(../name,../address,part))[1])]">
</xsl:apply-templates>