Умножьте 2 отфильтрованных числа и сумму - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно сложить умножение 2 чисел на основе этого примера

<test>
<stop>
    <id>1</id>
    <unit_id>1</unit_id>
    <unit_id>2</unit_id>
</stop>
<stop>
    <id>2</id>
    <unit_id>1</unit_id>
    <unit_id>3</unit_id>
</stop>
<unit>
    <id>1</id>
    <count>2</count>
    <value>1</value>
</unit>
<unit>
    <id>2</id>
    <count>4</count>
    <value>1</value>
</unit>
<unit>
    <id>3</id>
    <count>2</count>
    <value>3</value>
</unit>

Результат, который я хочу получить, показан ниже

<test>
<stop>
    <id>1</id>
    <sum>6</sum>
</stop>
<stop>
    <id>2</id>
    <sum>10</sum>
</stop>

Какие-нибудь советы, как его получить?

Я пытался с этим примером, но сумма молтипликации не работает, она подходит только для суммы или умножения, но не для обоих

<xsl:template match="stop">
<xsl:variable name="ship_unit" select="id"/>
<xsl:value-of select="sum(following-sibling::unit[id=$ship_unit]/count*following-sibling::unit[id=$ship_unit]/value)"/>

1 Ответ

0 голосов
/ 18 апреля 2019

Если я правильно угадываю, вы хотите сделать что-то вроде:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="unit" match="unit" use="id" />

<xsl:template match="/test">
    <xsl:copy>
        <xsl:for-each select="stop">
            <xsl:variable name="unit1" select="key('unit', unit_id[1])" />
            <xsl:variable name="unit2" select="key('unit', unit_id[2])" />
            <xsl:copy>
                <xsl:copy-of select="id"/>
                <sum>
                    <xsl:value-of select="$unit1/count * $unit1/value + $unit2/count * $unit2/value" />
                </sum>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Однако, результат применения этого к вашему примеру вводабудет:

<?xml version="1.0" encoding="utf-8"?>
<test>
  <stop>
    <id>1</id>
    <sum>6</sum>
  </stop>
  <stop>
    <id>2</id>
    <sum>8</sum>
  </stop>
</test>

, а не то, что вы отправили.

...