我有这个.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>
并且所需的转换类似于
<output>
<amount>KG</amount>
<total> "sum of all KG elements" </total>
<amount>PAL</amount>
<total> "sum of all PAL elements" </total>
<amount>M3</amount>
<total> "sum of all M3 elements" </total>
</output>
我尝试过像
这样的东西<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each select="output/quantities/quantity">
<amount>
<xsl:value-of select="unit"/>
<xsl:for-each select="output/quantities/quantity/value">
<xsl:value-of select="sum(output/quantities/quantity/value)"/>
</xsl:for-each>
</amount>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
但我没有得到值的总和,输出就像这样打破了
<output>
<amount>KG<total/></amount>
<amount>PAL<total/></amount>
<amount>M3<total/></amount>
<amount>KG<total/></amount>
<amount>PAL<total/></amount>
<amount>KG<total/></amount>
</output>
我已经尝试过其他一些解决方法,但没有一个工作到我想要的输出。如果有人能以任何方式提出任何建议或帮助,我将不胜感激。
现在我试图添加另一个节点,在第一个xml中调用,之后应该基本上具有被剥离的复制值的值,以便仅在小时后显示(hh:mm:ss)。我设法创建了原始xml的副本并添加了额外的标记,但我不确定如何提取小时数据并在内部标记中显示。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="date">
<xsl:copy-of select="."/>
<hour>
<xsl:comment> <xsl:copy-of select="substring(output/orders/order/date,11)"/> </xsl:comment>
</hour>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
以这种方式尝试:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="qty" match="quantity" use="unit"/>
<xsl:template match="/">
<output>
<amount>KG</amount>
<total><xsl:value-of select="sum(key('qty', 'KG')/value)"/></total>
<amount>PAL</amount>
<total><xsl:value-of select="sum(key('qty', 'PAL')/value)"/></total>
<amount>M3</amount>
<total><xsl:value-of select="sum(key('qty', 'M3')/value)"/></total>
</output>
</xsl:template>
</xsl:stylesheet>
请注意,这不是您可以选择的最佳输出格式;理想情况下,单位和数量将由一个共同的元素包含,而不仅仅是相邻的兄弟姐妹。