У меня есть три пользовательских скидки, и я пытаюсь получить сумму скидок, чтобы я мог показать ее в макете 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 > 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 > 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 > 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 как текстовое поле, загруженное как изображение.
Надеюсь, это поможет!