我正在寻找一个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的数量。 我已经尝试了所有的东西,但我能解决的唯一想法是找到所有东西的总量,而不是以测量单位来区分。 任何人都可以帮助我吗?
答案 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> </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> </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> </xsl:text>
<xsl:text>PAL: </xsl:text><xsl:value-of select="sum(//value[contains(preceding-sibling::*[1][name()='unit'], 'PAL')])"/><xsl:text> </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>