2016-09-21 2 views
0

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

Давайте Возьмем следующий XML

<REF> 
    <amount>3</amount> 
    <rate>7</rate> 
</REF> 
<A> 
    <amount>10</amount> 
    <rate>4</rate> 
</A> 
<A> 
    <amount>-21</amount> 
    <rate>2</rate> 
</A> 
<B> 
    <amount>8</amount> 
    <rate>1</rate> 
</B> 
<C> 
    <amount>7</amount> 
    <rate>32</rate> 
</C> 

Я хотел бы показать сумму каждой суммы, умноженной на каждой ассоциированной скорости в пределах общего элемента. И я хотел бы разделить мой итог на два элемента: NegativeTotal и PositiveTotal. PostiveTotal будет содержать СУММУ ((сумма * ставка), если значение больше (сумма * ставка) объекта REF) NegativeTotal будет содержать СУММУ ((сумма * ставка), если значение меньше (сумма * скорость) объекта REF)

она должна дать ниже выход

<Total> 
    <PositiveTotal> 
     264 <!-- 40 + 224 --> 
    </PositiveTotal> 
    <NegativeTotal> 
     -34 <!-- -42 + 8 --> 
    </NegativeTotal> 
</Total> 

Пожалуйста, дайте мне знать, если это возможно Для информации технических ограничений: XSLT 1.0

Спасибо заранее

С уважением,

ответ

1

Я хотел бы предложить вам сделать это таким образом:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/root"> 
    <!-- first pass --> 
    <xsl:variable name="summands-rtf"> 
     <xsl:for-each select="*"> 
      <value> 
       <xsl:value-of select="amount * rate" /> 
      </value> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name="summands" select="exsl:node-set($summands-rtf)/value" /> 
    <!-- get the threshold --> 
    <xsl:variable name="threshold" select="REF/amount * REF/rate" /> 
    <!-- output --> 
    <Total> 
     <PositiveTotal> 
      <xsl:value-of select="sum($summands[. > $threshold])" /> 
     </PositiveTotal> 
     <NegativeTotal> 
      <xsl:value-of select="sum($summands[. &lt; $threshold])" /> 
     </NegativeTotal> 
    </Total> 
</xsl:template> 

</xsl:stylesheet> 

При нанесении на хорошо сформированным ввод XML (с одним корневым элементом) :

XML

<root> 
    <REF> 
     <amount>3</amount> 
     <rate>7</rate> 
    </REF> 
    <A> 
     <amount>10</amount> 
     <rate>4</rate> 
    </A> 
    <A> 
     <amount>-21</amount> 
     <rate>2</rate> 
    </A> 
    <B> 
     <amount>8</amount> 
     <rate>1</rate> 
    </B> 
    <C> 
     <amount>7</amount> 
     <rate>32</rate> 
    </C> 
</root> 

результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<Total> 
    <PositiveTotal>264</PositiveTotal> 
    <NegativeTotal>-34</NegativeTotal> 
</Total> 

Обратите внимание, что продукт REF количества и скорости не входит ни в одном из двух сумм, как это ни выше, ни ниже порога , Аналогично, если любой другой продукт окажется равным порогу. это тоже будет исключено.

Смежные вопросы