简体   繁体   English

XSLT 1.0嵌套分组,总和和计数

[英]XSLT 1.0 Nested Grouping, Sum & Count

In XSLT 1.0 need to group by Address and then by Part and total. 在XSLT 1.0中,需要按地址分组,然后按部分和总数分组。 Currently if the part is not included in the first address element then it is omitted. 当前,如果该部分未包含在第一个地址元素中,则将其省略。 Very new to this. 这很新。

Output is - 输出是-

Total Units 7

name1address1
part1 Total Pallets : 1
part2 Total Pallets : 2

name2address2
part1 Total Pallets : 2
part2 Total Pallets : 1

Should Be - (Note Part 3 in Address 2) 应该是-(请注意地址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 is - 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 is - 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>

You are applying the pallet template only to the children of the first delivery in the name/address group. 您仅将托盘模板应用于名称/地址组中第一个交货的子代。 Try changing this: 尝试更改此:

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

to: 至:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM