尝试在XSLT中添加数字以创建总数,其中一些数字未定义

时间:2014-07-08 21:48:54

标签: xslt nan running-total

我试图为我公司每月总计的系统软件中的单个项目进行年度销售总额。我是通过编辑已经存在的xsl文件来做到这一点的,所以大部分代码都不是我的。我遇到的问题是它只适用于12个月中的每一个定义的多年。例如,在本年度,到8月份没有8月的数据,总数按NaN计算。我是XSLT的新手,但在来这里之前我已经研究了很多。这是我添加的代码的样子

        <!-- For each field value -->
        <xsl:for-each select="/zoom/query6[generate-id() = generate-id(key('rows-by-loc',concat(STK_LOC_ID,yr))[1])]">
          <TR ALIGN="CENTER">
            <!-- <xsl:for-each select="./*">
              <xsl:choose>
                <xsl:when test="(name()='STK_LOC_ID') or 
                          (name()='mo') or
                          (name()='yr')">
           -->
            <TD BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
                    <SMALL><xsl:value-of select="STK_LOC_ID"/></SMALL>
            </TD>
            <TD BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <SMALL>
                <xsl:value-of select="yr"/>
              </SMALL>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'January'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'January'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'January'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'February'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'February'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'February'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'March'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'March'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'March'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'April'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'April'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'April'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'May'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'May'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'May'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'June'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'June'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'June'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'July'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'July'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'July'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'August'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'August'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'August'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'September'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'September'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'September'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'October'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'October'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'October'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'November'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'November'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'November'))/Qty_Sold"/>
            </TD>
            <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'December'))/Sales" /></xsl:attribute>
              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'December'))/Qty_Sold" /></xsl:attribute>
              <xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'December'))/Qty_Sold"/>
            </TD>
    <TD ID="MEASURE" BGCOLOR="White" STYLE="height: 8px; FONT-SIZE: 8pt;" WIDTH="1%">
              <xsl:attribute name="Sales"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'December'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'November'))/Sales + key('rows-by-locmo', concat(STK_LOC_ID,yr,'October'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'September'))/Sales + key('rows-by-locmo', concat(STK_LOC_ID,yr,'August'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'July'))/Sales + key('rows-by-locmo', concat(STK_LOC_ID,yr,'June'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'May'))/Sales + key('rows-by-locmo', concat(STK_LOC_ID,yr,'April'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'March'))/Sales + key('rows-by-locmo', concat(STK_LOC_ID,yr,'February'))/Sales + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'January'))/Sales" /></xsl:attribute>

              <xsl:attribute name="Qty_Sold"><xsl:value-of select="key('rows-by-locmo', concat(STK_LOC_ID,yr,'December'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'November'))/Qty_Sold + key('rows-by-locmo', concat(STK_LOC_ID,yr,'October'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'September'))/Qty_Sold + key('rows-by-locmo', concat(STK_LOC_ID,yr,'August'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'July'))/Qty_Sold + key('rows-by-locmo', concat(STK_LOC_ID,yr,'June'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'May'))/Qty_Sold + key('rows-by-locmo', concat(STK_LOC_ID,yr,'April'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'March'))/Qty_Sold + key('rows-by-locmo', concat(STK_LOC_ID,yr,'February'))/Qty_Sold + key('rows-by-locmo', 
        concat(STK_LOC_ID,yr,'January'))/Qty_Sold " /></xsl:attribute>

            </TD>

我试图为每个月制作一个变量然后进行测试,但是一旦我添加变量,系统中的表单就不起作用了。谢谢!这也是查询的SQL代码

/*FIELDS_BEGIN*/ITEM_NO, STK_LOC_ID, PriorMonths, mo, yr, Sales, Qty_Sold/*FIELDS_END*/
/*NAME_BEGIN Monthly History NAME_END*/
FROM VI_PS_ITEM_LOC_MONTHLY_HIST
WHERE PriorMonths <= 35 and ITEM_NO =:self
order by yr

1 个答案:

答案 0 :(得分:0)

为简化起见,请考虑以下非常基本的XML

<root>
   <a year="2014" month="jan"><sales>100</sales></a>
   <a year="2014" month="feb"><sales>200</sales></a>
</root>

然后可以使用此基础XSLT

重新创建问题
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output omit-xml-declaration="yes" indent="yes" />

   <xsl:key name="year" match="a" use="concat(@year, @month)" />
   <xsl:param name="year" select="2014" />

   <xsl:template match="/*">
      <table>
          <tr><td>Jan</td><td><xsl:value-of select="key('year', concat($year, 'jan'))/sales" /></td></tr>
          <tr><td>Feb</td><td><xsl:value-of select="key('year', concat($year, 'feb'))/sales" /></td></tr>
          <tr><td>Mar</td><td><xsl:value-of select="key('year', concat($year, 'mar'))/sales" /></td></tr>
          <tr>
             <td>Total</td>
             <td><xsl:value-of select="key('year', concat($year, 'jan'))/sales + key('year', concat($year, 'feb'))/sales + key('year', concat($year, 'mar'))/sales" /></td>
          </tr>
       </table>
    </xsl:template>
</xsl:stylesheet>

哪个输出以下

<table>
  <tr>
    <td>Jan</td>
    <td>100</td>
  </tr>
  <tr>
    <td>Feb</td>
    <td>200</td>
  </tr>
  <tr>
    <td>Mar</td>
    <td/>
  </tr>
  <tr>
    <td>Total</td>
    <td>NaN</td>
  </tr>
</table>

解决这个问题的一种方法可能是定义一些变量,如:

 <xsl:variable name="jan" select="concat('0', key('year', concat($year, 'jan'))/sales)" />
 <xsl:variable name="feb" select="concat('0', key('year', concat($year, 'feb'))/sales)" />
 <xsl:variable name="mar" select="concat('0', key('year', concat($year, 'mar'))/sales)" />

这些在销售数字之前是0,所以空白销售意味着价值只有0.那么你的总数就变成了这个

 <xsl:value-of select="$jan + $feb + $mar" />

这假设您在这种情况下不会有负面销售。如果你确实有负片,那么表达式可能看起来像这样(考虑到&#34;不是&#34;如果为真则返回1,如果为假则返回0)

<xsl:variable name="jan" 
              select="concat(key('year', concat($year, 'jan'))/sales, 
                      substring('0', 1, 1 * not(key('year', concat($year, 'jan'))/sales)))" />

但是,有一种替代方法可以完成总计。定义一个不依赖于月份的关键字。在我的例子中,我会这样定义:

<xsl:key name="allyear" match="a" use="@year" />

然后,您可以使用总和功能

<xsl:value-of select="sum(key('allyear', $year)/sales)" />

您实际上并未在问题中显示xsl:key定义,但假设您定义了一个名为&#34; rows-by-locmo-all&#34;的新密钥,它与&#相同34;行逐locmo&#34;但不包括月份,那么你会像这样做总计:

<xsl:value-of select="sum(key('rows-by-locmo-all', concat(STK_LOC_ID,yr))/Sales)" />