首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有if语句的Xsl +向变量添加一些内容

带有if语句的Xsl +向变量添加一些内容
EN

Stack Overflow用户
提问于 2018-09-05 05:35:11
回答 2查看 59关注 0票数 1

我正在尝试显示一个输出,其中total_p_calib是一个for循环的值,其中我有一个if语句来比较我的值,看看sum(clb:quantidade) < ../../clb:quantidade是否相等,如果不相等,我想把两者之间的差异放在一个变量中,并在for循环的末尾显示它。

XML文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style_macaMoimenta.xsl"?>
<moimenta xmlns="http://www.macamoimenta.pt/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gnr="http://www.macamoimenta.pt/general" xmlns:clt="http://www.macamoimenta.pt/lote"
xmlns:prc="http://www.macamoimenta.pt/precario"
xmlns:clb="http://www.macamoimenta.pt/calibragem"
xsi:schemaLocation="http://www.macamoimenta.pt/ moimenta.xsd">
<produtores>
    <produtor>
        <codigo>PR001</codigo>
        <nome>Antonio Manuel</nome>
        <data_registo>2018-03-20</data_registo>
        <morada>
            <gnr:rua>Rua Antonio Manuel</gnr:rua>
            <gnr:numero>69</gnr:numero>
            <gnr:cod_postal>4569-123</gnr:cod_postal>
        </morada>
        <colheita>
            <ano>2018</ano>
            <qualidade>Ambrosia</qualidade>
            <cod_colheita>FE23569</cod_colheita>
            <valor>
                <prc:precario>
                    <prc:valor>0-60</prc:valor>
                    <prc:preco>0.10</prc:preco>
                </prc:precario>
                <prc:precario>
                    <prc:valor>60-65</prc:valor>
                    <prc:preco>0.13</prc:preco>
                </prc:precario>
                <prc:precario>
                    <prc:valor>65-70</prc:valor>
                    <prc:preco>0.17</prc:preco>
                </prc:precario>
                <prc:precario>
                    <prc:valor>DEFEITO</prc:valor>
                    <prc:preco>0.05</prc:preco>
                </prc:precario>
            </valor>
            <lotes>
                <lote>
                    <clt:n_lote>236598</clt:n_lote>
                    <clt:quantidade>2500</clt:quantidade>
                    <clt:calibragem>
                        <clb:calib>
                            <clb:valor>0-60</clb:valor>
                            <clb:quantidade>1000</clb:quantidade>
                        </clb:calib>
                        <clb:calib>
                            <clb:valor>60-65</clb:valor>
                            <clb:quantidade>0</clb:quantidade>
                        </clb:calib>
                        <clb:calib>
                            <clb:valor>65-70</clb:valor>
                            <clb:quantidade>1300</clb:quantidade>
                        </clb:calib>
                        <clb:calib>
                            <clb:valor>DEFEITO</clb:valor>
                            <clb:quantidade>200</clb:quantidade>
                        </clb:calib>
                    </clt:calibragem>
                </lote>
            </lotes>
        </colheita>
    </produtor>
</produtores>
</moimenta>

XSL文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:m="http://www.macamoimenta.pt/"
xmlns:gnr="http://www.macamoimenta.pt/general" 
xmlns:clt="http://www.macamoimenta.pt/lote"
xmlns:prc="http://www.macamoimenta.pt/precario"
xmlns:clb="http://www.macamoimenta.pt/calibragem"
exclude-result-prefixes="xs" version="1.0"
xmlns:datetime="http://exslt.org/dates-and-times">

<xsl:template match="/">
    <html>
       <body >
            <div border="1"> 
                <img src="Maça_moimenta.png" id="over" height="100"/>
            </div>
       <xsl:for-each select="m:moimenta/m:produtores">

       <xsl:for-each select="m:produtor/m:colheita/m:lotes/m:lote/clt:calibragem/clb:calib">
          <xsl:if test="sum(clb:quantidade) &lt; ../../clb:quantidade">
                <!-- Here i don't knot what to put  --->              
          </xsl:if>
        </xsl:for-each>

     <div> Value: <!-- the total value on the variable --> </div>
   </body>
 </html>
</xsl:template>

我需要为每个produtor都这样做,这就是为什么我有两个循环!

这是moimenta/produtores/produtor/colheita/calibragem/calib/quantidademoimenta/produtores/produtor/colheita/calibragem/quantidade内部的值之和的比较(这是较大的一个)

EN

回答 2

Stack Overflow用户

发布于 2018-09-05 07:52:27

你第一段的语言非常程序化(“我想放...比较...看...放...显示”)。这不是一个接近函数式编程的好方法,因为它是一个反向工程工作来解开它。

你的最后一段是你应该用来描述需求的语言“这是X和Y的和之间的比较”。不幸的是,作为一种需求陈述,它并不够精确。而且你没有显示出你想要的输出。

因此,我们要想知道您想要实现什么,唯一的方法就是尝试猜测您对不完整和不能工作的代码的意图。

我们唯一可以肯定的是,你所遵循的方法是行不通的。您不能在循环中更改变量的值(实际上,没有循环,只有映射函数)。

您似乎使用的是XSLT 1.0,这实际上使这种计算变得相当困难。XSLT1.0中的sum()函数只在节点集上工作,而不是在计算出的数字集上工作,这正是您在这里所需要的。如果您可以迁移到XSLT 2.0 (或3.0),那么它将使您的工作变得更容易。

在XSLT 1.0中,对计算值求和的典型方法是使用递归:需要编写一个命名模板,调用该模板处理一个值,然后调用该模板本身处理下一个值,将“到目前为止的结果”作为参数传递,并在到达输入中的最后一个值时返回最终结果。

函数式编程中的递归等同于过程语言中的循环。拥有强大的运算符来处理一组值意味着您通常不需要显式递归,但1.0中的函数和运算符通常不够强大。

票数 0
EN

Stack Overflow用户

发布于 2018-09-05 10:02:35

您不需要任何xsl:for-each循环。

只需计算所有m:colheita/m:lotes/m:lote/clt:calibragem/clb:calib/clb:quantidadesum()和所有m:colheita/m:lotes/m:lote/clt:quantidadesum(),然后从另一个中减去一个就可以得到$difference

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:m="http://www.macamoimenta.pt/"
    xmlns:gnr="http://www.macamoimenta.pt/general" 
    xmlns:clt="http://www.macamoimenta.pt/lote"
    xmlns:prc="http://www.macamoimenta.pt/precario"
    xmlns:clb="http://www.macamoimenta.pt/calibragem"
    exclude-result-prefixes="xs" version="1.0"
    xmlns:datetime="http://exslt.org/dates-and-times">

  <xsl:template match="/">
    <html>
      <body>
        <div border="1"> 
          <img src="Maça_moimenta.png" id="over" height="100"/>
        </div>
        <xsl:variable name="total" select="sum(m:moimenta/m:produtores/m:produtor/m:colheita/m:lotes/m:lote/clt:calibragem/clb:calib/clb:quantidade)"/>
        <xsl:variable name="difference" select="sum(m:moimenta/m:produtores/m:produtor/m:colheita/m:lotes/m:lote/clt:quantidade) - $total "/>
        <xsl:if test="$difference != 0">
          <div> Difference: <xsl:value-of select="$difference"/> </div>
        </xsl:if>                    
        <div> Value: <xsl:value-of select="$total"/> </div>         
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52174286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档