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



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

XML 文件

<?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 文件

<?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内部值之和之间的比较(这是较大的一个(

你第一段的语言非常程序化("我想把......比较。。。看。。。放。。。显示"(。这不是处理函数式编程的好方法,因为解开它是一项逆向工程工作。

您的最后一段是您应该用来描述需求的语言"这是 X 的总和和 Y 的总和之间的比较"。不幸的是,它作为需求声明不够精确。而且您没有显示所需的输出。

因此,我们确定您想要实现的目标的唯一方法是尝试猜测您不完整且不起作用的代码的意图。

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

您似乎正在使用 XSLT 1.0,这实际上使这种计算变得非常困难。XSLT 1.0 中的sum()函数仅适用于节点集,而不适用于计算数字集,而这正是您在此处所需要的。如果您可以迁移到 XSLT 2.0(或 3.0(,那么它将使您的生活更轻松。

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

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

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

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

<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>

最新更新