Altova Mapforce: умножение одиночных значений последовательности на одиночные значения последовательности

ищу решение своей проблемы. Я использую altova mapforce 2015 x64 с xslt2.

У меня есть две последовательности чисел в xslt2. они оба имеют одинаковую длину (и всегда будут). например они выглядят так:

последовательность 1: 10 20 ...

последовательность2: 1 2 ...

Что мне нужно, так это умножить эти два так, как seq1[0] умножается на seq2[0], seq[1]*seq[1] и так далее.

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

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

Спасибо

ИЗМЕНИТЬ:

проблема с altova заключается в том, что я не могу добавить код xslt2 самостоятельно, файл будет перезаписываться каждый раз, когда я что-то изменяю в сопоставлении.


person Walter    schedule 18.12.2014    source источник
comment
Этот вопрос связан с XSLT? Если да, не могли бы вы показать ввод XML и код XSLT, который у вас есть?   -  person Mathias Müller    schedule 18.12.2014
comment
Да, это реализовано в XSLT2. я использую altova mapforce, поэтому я не пишу код вручную, он генерируется. файл XSLT2 имеет почти 38 тысяч строк, поэтому нет возможности публиковать код. Я даже не могу найти ту часть, которую я описываю.   -  person Walter    schedule 18.12.2014
comment
Итак, откуда нам знать, какой ответ вам полезен, если не код?   -  person Mathias Müller    schedule 18.12.2014
comment
функция в altova mapforce была бы отличной. может кто-то сталкивался с этой проблемой до меня. проблема с altova заключается в том, что я не могу добавить код xslt2 самостоятельно, файл будет перезаписываться каждый раз, когда я что-то изменяю в сопоставлении.   -  person Walter    schedule 18.12.2014


Ответы (1)


Вы можете использовать xsl:for-each и диапазон для определения позиции. Вот пример...

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="seq1" select="(10,20)"/>
    <xsl:variable name="seq2" select="(1,2)"/>

    <xsl:template match="/">
        <xsl:variable name="newSeq" as="item()*">
            <xsl:for-each select="1 to max((count($seq1),count($seq2)))">
                <xsl:sequence select="$seq1[current()] * $seq2[current()]"/>
            </xsl:for-each>                        
        </xsl:variable>
        <results>
            <xsl:value-of select="$newSeq" separator=","/>
        </results>
    </xsl:template>

</xsl:stylesheet>

Выходные данные (разделены запятыми, чтобы показать, что это последовательность)

<results>10,40</results>

Примечание. Это будет обрабатывать только четное количество элементов последовательности. Если в какой-либо последовательности больше, чем в другой, они не будут включены в вывод. Вам нужно будет добавить дополнительную логику, если вам нужно справиться с этой ситуацией.

EDIT. Только что увидел ваш комментарий о невозможности самостоятельно добавить код XSLT. Я оставлю свой ответ здесь на случай, если кто-то, не использующий mapforce, найдет этот ответ полезным.

person Daniel Haley    schedule 18.12.2014
comment
Я попытаюсь восстановить это в Mapforce. в любом случае, спасибо. - person Walter; 18.12.2014