Nano Hash - криптовалюты, майнинг, программирование

XSL v.1, мюнхенская группировка, суммирование позиций по счету-фактуре, шаблон вызова

Я пытаюсь суммировать совокупность сумм позиций в группе с несколькими группами. То есть существует много счетов-фактур со многими позициями в каждом счете-фактуре. Мне нужно суммировать суммы статей по каждому счету-фактуре.

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

Группировка происходит по атрибуту recordId.

XML:

<?xml version="1.0" encoding="UTF-8"?>
<query>
    <results total="6">
        <result recordId="15918960" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$20.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>
        <result recordId="15918960" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$30.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>
        <result recordId="15918960" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$40.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>
        <result recordId="15918961" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$20.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>
        <result recordId="15918961" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$30.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>
        <result recordId="15918962" associatedRecordId="null" boId="10002385">
            <columns>
                <column>
                    <field>AmountNU</field>
                    <LI_Amount_display><![CDATA[$29.74]]></LI_Amount_display>
                </column>
            </columns>
        </result>       
    </results>
</query>

XSL:

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:datetime="http://exslt.org/dates-and-times"
xmlns:exsl="http://exslt.org/common"
xmlns:fn="http://www.w3.org/2013/xpath-functions"
exclude-result-prefixes="datetime">
    <xsl:output method="text" encoding="UTF-8" indent="no"/>

    <xsl:key name="recordID" match="result" use="@recordId"/><!-- Define a key to use for grouping the results -->
    <!-- Might be needed for nulls 
    <xsl:template match="/results/result/columns/column/LI_Amount_display[not(text()[normalize-space()])]"> 
    <xsl:element name='LI_Amount_display' value="0.00"></xsl:element> 
    </xsl:template> -->    

    <xsl:template match="/">
        <xsl:call-template name="fixTheWidth" >
            <!-- This parameter is a Id for each group of records based on the result/@recordId attribute. This groups all records to the record ID-->
            <xsl:with-param name="resultIndex" select="//results/result[generate-id(.) = generate-id(key('recordID', @recordId)[1])]" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="fixTheWidth" match="/results">
        <xsl:param name="resultIndex" /> <!-- A unique index based on grouping the records on the recordID -->

<!-- MORE CODE HERE USING $resultIndex has been redacted for simplicity-->

        <xsl:for-each select="$resultIndex" >
            <xsl:text> BEGIN | </xsl:text>
                <xsl:value-of select="number(translate(substring(key('recordID',@recordId)/columns/column/LI_Amount_display,2),',',''))"></xsl:value-of>
                <!-- <xsl:value-of select="sum(number(translate(substring(key('recordID',@recordId)/columns/column/LI_Amount_display,2),',','')))"></xsl:value-of>-->
        </xsl:for-each>   
         <xsl:text> | END  </xsl:text>


<!-- MORE CODE HERE USING $resultIndex has been redacted for simplicity-->


    </xsl:template>
</xsl:stylesheet>

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


  • Почему ваша таблица стилей содержит ссылку на узел columns/column/LI_Amount, которого нет в вашем вводе? 09.06.2015
  • это должно быть /LI_Amount_display. Я убрал лишний код для упрощения этого поста. Мои извинения за то, что я не вычитывал его более эффективно. я отредактировал это 09.06.2015

Ответы:


1

Вы не можете суммировать узлы, которые не являются числами. Значение $20.74 — это строка, а не число. Вы должны сначала преобразовать значения в числа, удалив символ валюты (и любые другие нечисловые символы, если они разрешены во входных данных), затем приступить к группировке полученных узлов и суммированию групп.

Вот пример:

XSLT 1.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="amt" match="amount" use="@id"/>

<xsl:template match="/query">
    <xsl:variable name="amounts">
        <xsl:for-each select="results/result">
            <amount id="{@recordId}"><xsl:value-of select="translate(columns/column/LI_Amount_display, '$', '')"/></amount>
        </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="amount-set" select="exsl:node-set($amounts)/amount" />

    <xsl:for-each select="$amount-set[generate-id() = generate-id(key('amt', @id)[1])]" >
        <xsl:text> BEGIN | </xsl:text>
        <xsl:value-of select="sum(key('amt', @id))"/>
    </xsl:for-each>   
    <xsl:text> | END  </xsl:text> 
</xsl:template>

</xsl:stylesheet>

Применительно к вашему примеру ввода результат:

 BEGIN | 92.22 BEGIN | 51.48 BEGIN | 29.74 | END  

Я не мог понять стратегию вызова шаблона и «создать плоский файл фиксированной ширины». В любом случае, это не имеет отношения к рассматриваемому вопросу. При необходимости вы можете опубликовать отдельный вопрос.

09.06.2015
  • Я пробовал это, и я могу заставить его работать, как вы это написали. Но если я попытаюсь поместить его в шаблон fixTheWidth, а также сохранить текущую группировку $resultIndex. В настоящее время он выполняет итерацию по каждому $resultIndex, выравнивая выходные данные каждого счета и всех его позиций, прежде чем перейти к следующему. Рассматриваемый фрагмент кода состоит в том, чтобы суммировать все позиции как валовую сумму и выводить ее в строке заголовка, содержащей информацию о счете-фактуре. 11.06.2015
  • @RebelPhoenix Как я уже сказал, я не мог понять, что вы делаете, поэтому я не могу посоветовать, как включить в это мое предложение. Либо разверните свой вопрос и объясните дополнительные требования, либо опубликуйте новый. 11.06.2015
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..