XSLT v1 - Рассчитать сумму скидок на макет счета для PDF - Ошибка NaN - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть три пользовательских скидки, и я пытаюсь получить сумму скидок, чтобы я мог показать ее в макете PDF.

Мне нужно запрограммировать это в XSL v1.0, так как это то, что CRM использует для создания шаблонов PDF. Полный сценарий представляет собой комбинированный макет документа для всех документов (кавычки, заказы, контракты и счета-фактуры), поэтому я показал только выписку.

В моих тестовых данных есть три линии продуктов, и применяется как минимум одна скидка на каждой из линий продуктов.

LINE 1 Band Relief 302.5 Regional Discount 50% Price Discount 0%
LINE 2 Band Relief 10 Regional Discount 0% Price Discount 0%
LINE 3 Band Relief 0 Regional Discount 0% Price Discount 5%

Я пытался адаптировать код Майкла Хор257к ( XSL v1.0 и XPath для обхода глубокого вложения и рекурсивного суммирования всех строк ) следующим образом :

<?xml version="1.0" encoding="UTF-8"?>

<xslt:stylesheet xmlns:date="http://exslt.org/dates-and-times" xmlns:str="http://exslt.org/strings" xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xf="http://www.ecrion.com/xf/1.0" xmlns:xc="http://www.ecrion.com/2008/xc" xmlns:xfd="http://www.ecrion.com/xfd/1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" extension-element-prefixes="date str">
  <xslt:output indent="yes" encoding="utf-8"/>


<!-- ==== SUM NODES TEMPLATE ==== -->

  <xsl:template name="sum-nodes" >
    <xsl:param name="nodes"/>
    <xsl:param name="sum" select="0"/>
    <xsl:param name="newSum" select="$sum + translate($nodes[1], '$,', '')"/>
    <xsl:choose>
        <xsl:when test="count($nodes) > 1">
             <!-- recursive call --> 
            <xsl:call-template name="sum-nodes" >
                <xsl:with-param name="nodes" select="$nodes[position() > 1]" />
                <xsl:with-param name="sum" select="$newSum" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="format-number($newSum, '#,##0.00')"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

и в основном шаблоне:

<xslt:template = "/">

<!-- === TESTING VARIABLES === -->

          <fo:block padding-top="0.45cm" font-size="9pt" padding-bottom="0cm">
            <xsl:for-each select = "/hash/order_line_items/order_line_item">
                <fo:block padding-top="0.45cm" font-size="9pt" padding-bottom="0cm">
                    <fo:inline>
                        Band Relief <xsl:value-of select="sum(cf_customer_invoice_line_item_band_relief/@amount)"/>
                        Regional Discount <xsl:value-of select="sum(additional_discount_1_percent)"/>
                        Price Discount <xsl:value-of select="sum(discount_percent)"/>
                    </fo:inline>
                </fo:block>
            </xsl:for-each> 
          </fo:block>

          <fo:block padding-top="0.45cm" font-size="9pt" padding-bottom="0cm">
            <fo:inline>

                <fo:inline> Band Total </fo:inline>
                <xsl:call-template name="sum-nodes" >
                    <xsl:with-param name="nodes" select="cf_customer_invoice_line_item_band_relief[@amount &gt; 0]" />
                </xsl:call-template>

                <fo:inline> Regional Total </fo:inline>
                <xsl:call-template name="sum-nodes" >
                    <xsl:with-param name="nodes" select="additional_discount_1_percent/@amount[@amount &gt; 0]" />
                </xsl:call-template>

                <fo:inline> Discount Total </fo:inline>
                <xsl:call-template name="sum-nodes" >
                    Discount Total <xsl:with-param name="nodes" select="discount_percent/@amount[@amount &gt; 0]" />
                </xsl:call-template>

        <!--        $regional_discount_1 <xsl:value-of select="$regional_discount_1"/> -->
        <!--        $price_discount <xsl:value-of select="$price_discount"/> -->
            </fo:inline>
          </fo:block>


</xslt:template>

однако сумма дает только NaN-результаты.

Поля скидок либо в валюте, либо в процентах (или ноль) ).

ВЫХОД:

Band Relief 302.5 Regional Discount 50 Price Discount 0
Band Relief 10 Regional Discount 0 Price Discount 0
Band Relief 0 Regional Discount 0 Price Discount 5
Band Total NaN Regional Total NaN Discount Total NaN

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

Band Total £312.50 Regional Total 50% Discount Total 5%

Я несколько дней ходил кругами, пытаясь заставить это работать! Любая помощь будет принята с благодарностью!

Обновление:

Я не могу извлечь полную структуру XML, поскольку она встроена в базу данных, но для счета-фактуры Таблица позиций, к которой она относится:

                <xsl:for-each select="/hash/order_line_items/order_line_item[contains(./_preload_product_id, 'SHIPPING')=false()]">
              <fo:table-row>

                <fo:table-cell border-width="1pt" border-style="solid" border-color="rgb(0,0,0)" padding="2pt" text-align="right">
                  <xsl:attribute name="border-color">
                    <xsl:value-of select="/hash/text/Table_Border_Colour"/>
                  </xsl:attribute>
                  <fo:block font-size="8pt">
                    <fo:inline>
                      <xsl:value-of select="unit_quantity"/>
                    </fo:inline>
                  </fo:block>
                </fo:table-cell>

et c, поэтому я предполагаю, что это / hash / order_line_items / order_line_item /

Обновление 2

В качестве данных встроен в CRM, я не могу извлечь данные в виде файла XML.

Все, что я могу сделать, это экспортировать образцы данных из базы данных в виде отчета: если нет разгрузки полосы, есть значение не указано. Сброс диапазона установлен в валюте (но не указывается, если скидка не применяется), в то время как две другие скидки установлены в процентах.

csv данных счета

Невозможно отобразить импортировать CSV как текстовое поле, загруженное как изображение.

Надеюсь, это поможет!

...