2

我想根据元素的属性以不同的方式计算值,然后对计算值求和。

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:alternatives在 XSD 中使用了创建不同“类型”的元素。

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>

我希望能够在计算后显示该值(其因子取决于它的“类型”。),按日期对不同的值进行排序并显示所有计算值的总和。

我确信有更好的方法来做我想做的事,我很高兴有任何建议。

4

1 回答 1

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="'&#xA;'"/>
        <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
于 2013-06-03T00:35:01.757 回答