如何在xsl中为每个具有条件语句的内部总结值?

时间:2016-09-03 15:52:36

标签: xslt sum

让我们说,

我有一个引用,它有多个引号。它们因LineNumbers(1.1,1.2,2.1,2.2,...)而不同。在配置中(假设以1. *或2. *开头),我想总结所有价格(1.1,1.2,1.3)并将其放入xsl变量中。以同样的方式,如果有多个配置,我想做同样的事情。(将所有配置分组并将价格总和放入变量[v1,v2,v3])。

输入XML:

<Quotelines>
 <name>p1</name>
 <lineNo>1.1</lineNo>  
 <amount>100</amount>
 <Qid>1234</Qid>
</Quotelines>
<Quotelines>
 <name>p2</name>
 <lineNo>1.2</lineNo> 
 <amount>1400</amount>
 <Qid>1234</Qid>
</Quotelines> 
<Quotelines>
 <name>p3</name>
 <lineNo>1.4</lineNo> 
 <amount>600</amount>
 <Qid>1234</Qid>
</Quotelines>
<Quotelines>
 <name>p1</name>
 <lineNo>2.1</lineNo>
 <amount>1300</amount>
 <Qid>1234</Qid>
</Quotelines>
<Quotelines>
 <name>p2</name>
 <lineNo>2.2</lineNo>
 <amount>100</amount>
 <Qid>1234</Qid>
</Quotelines> 
<Quotelines>
 <name>p1</name>
 <lineNo>1.1</lineNo>
 <amount>100</amount>
 <Qid>4321</Qid>
</Quotelines>
<Quotelines>
 <name>p2</name>
 <lineNo>1.2</lineNo>
 <amount>100</amount>
 <Qid>4321</Qid>
<Quotelines>

在上面给出的例子中,我想分离相同Qid(1234)的配置(1. ,2。)并获得要存储在variable1中的金额总和(1. em>),variable2(2。)等..,

这是我的XSL:

<xsl:template match="/">
<xsl:variable name="tmpTotal">
  <xsl:for-each select="Quotelines>
    <xsl:if test="starts-with(lineNo,'1.')">
      <xsl:value-of select="amount"/>
    </xsl:if>
  </xsl:for-each>
</xsl:variable>
<xsl:variable name="variable1">
  <xsl:value-of select="sum($tmpTotal)"/>
</xsl:variable>

在这个XSL中,我用1 *硬编码lineNo。 我得到输出为(concatinating):

1001400600 

必需的输出是:

2100

1 个答案:

答案 0 :(得分:1)

你没有&#34; 总结每个有条件陈述的内部值&#34;。您可以使用sum()函数直接对它们求和 - 然后在谓词中添加条件,例如:

<xsl:variable name="variable1" select="sum(Quotelines[starts-with(lineNo, '1.')]/amount)" />
  

在这个XSL中,我用1。*。

对lineNo进行了硬编码

为了避免硬编码,请使用Muenchian grouping(在XSLT 1.0中)或xsl:for-each-group(在XSLT 2.0中)学习如何在XSLT中分组记录。