Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在XSLT1.0中计算每个循环中的值并求和_Xslt_Sum_Accumulate - Fatal编程技术网

需要在XSLT1.0中计算每个循环中的值并求和

需要在XSLT1.0中计算每个循环中的值并求和,xslt,sum,accumulate,Xslt,Sum,Accumulate,假设我有一个简单的输入XML文档,如: <Amounts> <item> <Base>4750</Base> <Tax1>2800</Tax1> <Tax2>50</Tax2> </item> <item> <Base>4750</Base> <

假设我有一个简单的输入XML文档,如:

<Amounts>
    <item>
        <Base>4750</Base>
        <Tax1>2800</Tax1>
        <Tax2>50</Tax2>
    </item>
    <item>
        <Base>4750</Base>
        <Tax1>2800</Tax1>
        <Tax2>50</Tax2>
    </item>
</Amounts>

4750
2800
50
4750
2800
50
和XSLT作为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output  version="1.0" method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
      <xsl:element name="MyTax">
        <xsl:variable name="bf" select="sum(//item/Base)"/>
        <xsl:variable name="discount" select="$bf * 0.08"/>
        <xsl:variable name="bf1" select="$bf - $discount"/>
        <xsl:variable name="yq1" select="sum(//item/Tax1)"/>
        <xsl:variable name="yr1" select="sum(//item/Tax2)"/>
        <xsl:variable name="stax">
            <xsl:value-of select="round(format-number((($bf1 + $yq1 + $yr1) * 0.0495),'#.##'))"/>
        </xsl:variable>
        <xsl:element name="Stax"><xsl:value-of select="$stax"/></xsl:element>
      </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我们得到一个输出XML,如下所示:

<MyTax>
    <Stax>715</Stax>
</MyTax>

715
但是,现在我想分别计算每个项目的stax,然后将这些项目相加-这是因为在上面的示例中,我最终得到了舍入误差,因为单个stax的总和实际上是714-我要寻找的值,而不是上面的715

所以我想要的结果是:

<MyTax>
         <item>
    <Stax>357</Stax>
         </item>
         <item>
            <Stax>357</Stax>
         </item>
         <TotalStax>714</TotalStax>
</MyTax>

357
357
714

虽然我可以为每个过程设置一个变量,但如何将每个过程的stax计算成一个变量,然后将各个stax相加?我受XSLT 1.0的限制,看到了一些使用键和节点集的答案,但无法理解如何应用它们。

此XSLT 1.0转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:variable name="vrtfTaxSeq">
       <xsl:apply-templates/>
     </xsl:variable>

     <xsl:value-of select="sum(ext:node-set($vrtfTaxSeq)/*)"/>
 </xsl:template>

 <xsl:template match="item">
  <ttax>
   <xsl:value-of select="round(0.0495*(Base - 0.08*Base + Tax1 + Tax2))"/>
  </ttax>
 </xsl:template>
</xsl:stylesheet>
<Amounts>
    <item>
        <Base>4750</Base>
        <Tax1>2800</Tax1>
        <Tax2>50</Tax2>
    </item>
    <item>
        <Base>4750</Base>
        <Tax1>2800</Tax1>
        <Tax2>50</Tax2>
    </item>
</Amounts>
714

请注意必须使用
xxx:node-set()
扩展函数(使用递归可以避免这种情况)。

XSLT只对整个输入执行一次stax计算。它无法生成您显示的输出。
stax
的计算值为714.78,您已要求处理器对其进行四舍五入。这个数字是715。为什么要714输出?Jim,我实际上需要生成714求和-这只能通过在每次运行(357)中分别计算stax并对所有单个stax求和得到357+357=714,而不是715,如果我对单个项的和进行计算的话。我无法为这个必需的输出创建XSLT…很抱歉响应太晚。这确实为上述数据产生了正确的结果,但我很好奇,当我需要根据我们对结果计算的要求进行四舍五入,然后进行总结时,为什么您使用floor(为什么它有效?)——如果答案得出这样的值,我还需要能够进行四舍五入,没有办法得到714——实际结果是>714.5我试图得到的是四舍五入(4750-4750*0.08+2800+50)=四舍五入(357.39)=357,上面的每一项,然后求和(357357)=714。而不是我之前所做的(0.0495*(8740+5600+100))=round(714.78)=715,这对我的申请是不正确的。此外,折扣是一个参数,因此我可以有12%的收益率(0.0495*(4750*0.88+2800+50))=348,而不是0.08(8%折扣)。求和为348+348=696。在您的xsl中,该值将是floor,改为695,而我需要696。如何对每个项目进行取整,然后对每个结果求和?您需要编辑您的问题并解释此要求--强迫人们猜测不需要的答案中的结果。抱歉,我没有注意到我取消了“接受”复选框。我试着投票认为它有用@迪米特里,你的回答为我提供了一个解决方案的充分方向,因此肯定是有帮助的。我想我已经在一开始澄清了我试图通过所需的输出XML输出的内容,作为项目的两组Stax,最后是TotalStax,它是单个Stax的简单和。我提供的示例XSL是针对我目前正在做的事情,即添加所有内容,然后计算轮数(0.0495*…),同时说明我想要得到什么。