我想根据元素的属性计算不同的值,然后将计算出的值相加。
xml结构如下所示:
<elements>
<element type="type1">
<value>10</value>
<date>01.05.2012</date>
</element>
<element type="type2">
<value>20</value>
<date>02.03.2012</date>
</element>
<element type="type2">
<value>20</value>
<date>02.03.2012</date>
</element>
</elements>
我在XSD中使用xsd:alternatives
来创建不同的“类型”元素。
XSL看起来像这样:
<xsl:for-each select="/elements">
<xsl:sort select="date"/>
<xsl:choose>
<xsl:when test="type='type1'">
<xsl:value-of select="value*20"/>
<xsl:value-of select="date"/>
</xsl:when>
<xsl:when test="type='type1'">
<xsl:value-of select="value*10"/>
<xsl:value-of select="date"/>
</xsl:when>
</xsl:choose>
(Here should be a sum of all the values that have been calculated.)
</xsl:for-each>
我希望能够在计算后显示该值(因子取决于它的“类型”。),按日期对不同的值进行排序,并显示所有计算值的总和。
我相信有更好的方法可以做我想做的事情,我对任何建议感到高兴。
答案 0 :(得分:1)
假设@type="type1" should be multiplied by 10 and
@ type =“type2”`应该乘以20,以下样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="elements/element">
<xsl:sort select="date" />
</xsl:apply-templates>
<xsl:value-of select="'
'"/>
<xsl:value-of select="sum(*/element[@type='type1']/value
[number()=number()]) * 10 +
sum(*/element[@type='type2']/value
[number()=number()]) * 20"/>
</xsl:template>
<xsl:template match="element[@type='type1']/value">
<xsl:value-of select=". * 10"/>
</xsl:template>
<xsl:template match="element[@type='type2']/value">
<xsl:value-of select=". * 20"/>
</xsl:template>
<!-- this matches any of the value elements who's values are not a number -->
<xsl:template match="element[@type]/value[number()!=number()]">
<xsl:text>0</xsl:text>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
100
01.05.2012
400
02.03.2012
400
02.03.2012
900