每个不同单位的数量总和(kg,pal,m ^ 3)

时间:2015-06-03 12:50:08

标签: xml xslt xslt-1.0

我正在寻找一个XSL脚本,它将返回此xml文件中每个不同数量的总和

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
    <orders>
        <order>
            <id>1</id>
            <number>10002</number>
            <type>Loading</type>
            <date>2013-01-01T02:30:00</date>
        </order>
        <order>
            <id>2</id>
            <number>10003</number>
            <type>Loading</type>
            <date>2013-01-01T010:30:00</date>
        </order>
        <order>
            <id>3</id>
            <number>10004</number>
            <type>Loaded</type>
            <date>2013-01-01T12:30:00</date>
        </order>
    </orders>
    <quantities>
        <quantity>
            <id_order>1</id_order>
            <unit>KG</unit>
            <value>1000</value>
        </quantity>
        <quantity>
            <id_order>1</id_order>
            <unit>PAL</unit>
            <value>3</value>
        </quantity>
        <quantity>
            <id_order>1</id_order>
            <unit>M3</unit>
            <value>1.5</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>KG</unit>
            <value>2000</value>
        </quantity>
        <quantity>
            <id_order>2</id_order>
            <unit>PAL</unit>
            <value>4</value>
        </quantity>
        <quantity>
            <id_order>3</id_order>
            <unit>KG</unit>
            <value>5000</value> 
        </quantity>
    </quantities>
</output>

我需要PAL的总数量,KG和M3的数量。 我已经尝试了所有的东西,但我能解决的唯一想法是找到所有东西的总量,而不是以测量单位来区分。 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

在XSLT 1.0中,类似......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:key name="kDistinctUnit" match="quantity" use="unit"/>

<xsl:template match="/">
    <!-- just skip to test bit -->
    <xsl:apply-templates select="//quantities"/>
</xsl:template>

<xsl:template match="quantities">
    <xsl:for-each select="quantity[generate-id(.) = generate-id(key('kDistinctUnit',unit))]">
        <xsl:value-of select="unit"/>
        <xsl:text> = </xsl:text>
        <xsl:value-of select="sum(key('kDistinctUnit',unit)/value)"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

或在XSLT 2.0中,类似......

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
    <!-- just skip to test bit -->
    <xsl:apply-templates select="//quantities"/>
</xsl:template>

<xsl:template match="quantities">
    <xsl:for-each-group select="quantity" group-by="unit">
        <xsl:value-of select="current-grouping-key()"/>
        <xsl:text> = </xsl:text>
        <xsl:value-of select="sum(current-group()/value)"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

试试这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="quantities">
        <xsl:text>KG: </xsl:text><xsl:value-of select="sum(//value[contains(preceding-sibling::*[1][name()='unit'], 'KG')])"/><xsl:text>&#10;</xsl:text>
        <xsl:text>PAL: </xsl:text><xsl:value-of select="sum(//value[contains(preceding-sibling::*[1][name()='unit'], 'PAL')])"/><xsl:text>&#10;</xsl:text>
        <xsl:text>M3: </xsl:text><xsl:value-of select="sum(//value[contains(preceding-sibling::*[1][name()='unit'], 'M3')])"/>
    </xsl:template>

    <xsl:template match="orders"/>
</xsl:stylesheet>

答案 2 :(得分:0)

围绕这个特定问题查看你的其他问题,希望以下的XSLT 1.0能够提供你可能需要的所有内容......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:key name="kDistinctUnit" match="quantity" use="unit"/>
<xsl:key name="kDistinctUnitByOrder" match="quantity" use="concat(id_order,'||',unit)"/>
<xsl:key name="kQuantityByOrder" match="quantity" use="id_order"/>

<xsl:template match="order">
    <xsl:copy>
        <xsl:copy-of select="@* | *"/>
        <!-- totals for this order -->
        <xsl:variable name="vOrderId" select="id"/>
        <xsl:for-each select="key('kQuantityByOrder', $vOrderId)[generate-id(.) = generate-id(key('kDistinctUnitByOrder', concat($vOrderId,'||',unit)))]">
            <xsl:element name="{unit}">
                <xsl:value-of select="sum(key('kDistinctUnitByOrder', concat($vOrderId,'||',unit))/value)"/>
            </xsl:element>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

<!-- show total quantities, by unit, across all orders -->
<xsl:template match="quantities">
    <total_quantities>
        <xsl:for-each select="quantity[generate-id(.) = generate-id(key('kDistinctUnit',unit))]">
            <xsl:element name="{unit}">
                <xsl:value-of select="sum(key('kDistinctUnit',unit)/value)"/>
            </xsl:element>
        </xsl:for-each>
    </total_quantities>
</xsl:template>

<!-- identity transform stuff -->
<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@* | text() | comment() | processing-instruction()">
    <xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>