Xsl与if语句+向变量添加内容

时间:2018-09-04 21:35:11

标签: xml xslt xslt-1.0

我试图显示一个输出,其中java -jar selenium-server-standalone-version.jar -port 4545是一个for循环的值,在这里我有一个if语句,该语句比较我的值以查看total_p_calib是否相等,如果不相等,希望将两者之间的差异放入变量中,并在for循环的末尾显示出来。

XML文件

sum(clb:quantidade) < ../../clb:quantidade

XSL文件

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

我需要为每个<?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> 做一次,这就是为什么我有两个周期!

这是produtormoimenta/produtores/produtor/colheita/calibragem/calib/quantidade内部值的总和之间的比较(这是较大的值)

2 个答案:

答案 0 :(得分:0)

您第一段的语言非常具有程序性(“我想放...比较...看...放...显示”)。这不是进行函数式编程的好方法,因为解开它是一项逆向工程。

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

因此,确定您要实现的目标的唯一方法是尝试猜测不完整且无法正常工作的代码的意图。

我们可以肯定地说的唯一一件事就是您遵循的方法行不通。您无法在循环内更改变量的值(实际上,没有循环,只有映射函数)。

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

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

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

答案 1 :(得分:0)

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

只需计算所有sum()的{​​{1}}和所有m:colheita/m:lotes/m:lote/clt:calibragem/clb:calib/clb:quantidade的{​​{1}},然后从另一个中减去一个即可找到sum()

m:colheita/m:lotes/m:lote/clt:quantidade