Xsl с оператором if + добавить что-то в переменную - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь показать вывод, где 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/quantidade и moimenta/produtores/produtor/colheita/calibragem/quantidade (это больше)

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вам не нужны петли xsl:for-each.

Просто вычислите sum() всех m:colheita/m:lotes/m:lote/clt:calibragem/clb:calib/clb:quantidade и sum() всех m:colheita/m:lotes/m:lote/clt:quantidade, а затем вычтите одно из другого, чтобы найти $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>
0 голосов
/ 05 сентября 2018

Язык вашего первого абзаца очень процедурный ("Я хочу поставить ... сравнить ... посмотреть ... поставить ... показать"). Это не очень хороший подход к функциональному программированию, потому что это задача обратного инжиниринга.

Ваш последний абзац - это тот язык, который вы должны использовать для описания требований: «Это сравнение между суммой X и суммой Y». К сожалению, это не совсем точно, как заявление о требованиях. И вы не показываете желаемый результат.

Таким образом, наш единственный способ решить, чего вы хотите достичь, это попытаться угадать, что вы хотели с помощью своего неполного и нерабочего кода.

Единственное, что мы можем сказать наверняка, это то, что подход, который вы используете, не будет работать. Вы не можете изменить значение переменной в цикле (фактически, циклов нет, только функции отображения).

Похоже, вы используете XSLT 1.0, что на самом деле делает подобные вычисления довольно сложными. Функция sum() в XSLT 1.0 работает только с наборами узлов, а не с наборами вычисляемых чисел, что вам и нужно. Если вы сможете перейти на XSLT 2.0 (или 3.0), это облегчит вашу жизнь.

Типичный способ суммирования вычисленных значений в XSLT 1.0 - с помощью рекурсии: вам нужно написать именованный шаблон, который вызывается для обработки одного значения, который затем вызывает себя для обработки следующего значения, передавая "результат так далеко", как параметр, и возвращая окончательный результат, когда вы доберетесь до последней вещи на входе.

Рекурсия в функциональном программировании является эквивалентом зацикливания в процедурных языках. Наличие мощных операторов для работы с наборами значений означает, что вам часто не требуется явная рекурсия, но функции и операторы в 1.0 часто недостаточно мощны.

...