Проблема суммирования итогов в шаблоне XSLT - PullRequest
2 голосов
/ 18 декабря 2008

У меня проблема с попыткой суммировать некоторые значения с помощью XSLT. Я шаблон онлайн и изменил его для моих нужд. ( текст ссылки )

Независимо от того, как я стараюсь, я не могу получить шаблон для суммирования чисел. В итоге я получаю либо «0», либо объединение чисел, которые я хочу суммировать. Если бы кто-то мог посмотреть и указать, где я иду не так, я был бы очень благодарен.

Спасибо

** ШАБЛОН **

print("<xsl:template match="Parts">
    <root>
        <xsl:variable name="tmpTotal">
            <total_amount>
                <xsl:for-each select="Part">
                    <item>
                        <xsl:value-of select="Duration"/>
                    </item>
                </xsl:for-each>
            </total_amount>
        </xsl:variable>
        <total>
            <xsl:variable name="myTotal" select="number(msxsl:node-set($tmpTotal))" /> <!--Shows up as 0-->
            <xsl:value-of select="sum(msxsl:node-set($myTotal)/total_amount/item)" />
            <!--<xsl:variable name="myTotal" select="msxsl:node-set($tmpTotal)" />--> <!-- Shows up as concatenation-->
            <!--<xsl:value-of select="msxsl:node-set($myTotal)" />--> 
        </total>
    </root>
</xsl:template>");

** XML **

print("<Parts>
<Part>
  <PartNum>0000-A123</PartNum> 
  <Rate>0</Rate> 
  <Rate0Decimal>0</Rate0Decimal> 
  <ProductRemovedNumber>...</ProductRemovedNumber> 
  <Qty>2</Qty> 
  <Resolution>False</Resolution> 
  <ReturnFA>False</ReturnFA> 
  <SerialNumber /> 
  <TickProblemCD>15</TickProblemCD> 
  <TicketNum>075020009000048</TicketNum> 
  <Total>0</Total> 
  <Total0Decimal>0</Total0Decimal> 
  <TotalDisplay>0</TotalDisplay> 
  <UserNumber>009</UserNumber> 
  </Part>
<Part>
  <Duration>2</Duration>
  <Total>0</Total> 
  <PartCost>0.00</PartCost> 
  <PartCost0Decimal>0</PartCost0Decimal> 
  <PerformedBy>TEST</PerformedBy> 
  <WorkDoneCode /> 
  <WorkDoneDesc /> 
  <ZoneBasedTravel>False</ZoneBasedTravel> 
  <PartNum>Travel</PartNum> 
  <PartDescr>---</PartDescr> 
  <Qty>2</Qty> 
  </Part>
<Part>
  <Duration>4</Duration> 
  <DurationRequired>True</DurationRequired> 
  <EndTime>12/4/2008 2:24 PM</EndTime> 
  <EndTimeOnly>12/4/2008</EndTimeOnly> 
  <FamilyName>NON-COMPLAINT</FamilyName> 
  <FOC>False</FOC> 
  <InvTxnGenerated /> 
  <LastUpdatedDate>12/4/2008 2:24 PM</LastUpdatedDate> 
  <Rate>0</Rate> 
  <Rate0Decimal>0</Rate0Decimal> 
  <RateType>Install</RateType> 
  <Total>0</Total> 
  <PartCost>0.00</PartCost> 
  <PartCost0Decimal>0</PartCost0Decimal> 
  <PerformedBy>TEST</PerformedBy> 
  <WorkDoneCode>17000</WorkDoneCode> 
  <WorkDoneDesc>De-Installation / Instrument Move</WorkDoneDesc> 
  <ZoneBasedTravel>False</ZoneBasedTravel> 
  <PartNum>Labor</PartNum> 
  <PartDescr>Install</PartDescr> 
  <Qty>4</Qty> 
  </Part>
<Part>
  <Duration>1</Duration> 
  <DurationRequired>True</DurationRequired> 
  <EndTime>12/4/2008 2:24 PM</EndTime> 
  <EndTimeOnly>12/4/2008</EndTimeOnly> 
  <FamilyName>NON-COMPLAINT</FamilyName> 
  <FOC>False</FOC> 
  <InvTxnGenerated /> 
  <LastUpdatedDate>12/4/2008 2:24 PM</LastUpdatedDate> 
  <Rate>0</Rate> 
  <Rate0Decimal>0</Rate0Decimal> 
  <RateType>TSB/ISA</RateType> 
  <Total>0</Total> 
  <PartCost>0.00</PartCost> 
  <PartCost0Decimal>0</PartCost0Decimal> 
  <PerformedBy>TEST</PerformedBy> 
  <WorkDoneCode>13000</WorkDoneCode> 
  <WorkDoneDesc>TSB / ISA - Installed</WorkDoneDesc> 
  <ZoneBasedTravel>False</ZoneBasedTravel> 
  <PartNum>Labor</PartNum> 
  <PartDescr>TSB/ISA</PartDescr> 
  <Qty>1</Qty> 
  </Part>
  </Parts>");

1 Ответ

4 голосов
/ 18 декабря 2008

Вы не объясняете, какие именно значения суммируются.

Судя по представленному коду XSLT, кажется, что вам нужна сумма значений всех элементов "Duration" . Это можно получить с помощью следующего простого выражения XPath:

sum(/*/*/Duration)

Ниже приведено полное преобразование XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

    <xsl:template match="/">
      <xsl:value-of select="sum(/*/*/Duration)"/>
    </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<Parts>
    <Part>
        <PartNum>0000-A123</PartNum>
        <Rate>0</Rate>
        <Rate0Decimal>0</Rate0Decimal>
        <ProductRemovedNumber>...</ProductRemovedNumber>
        <Qty>2</Qty>
        <Resolution>False</Resolution>
        <ReturnFA>False</ReturnFA>
        <SerialNumber />
        <TickProblemCD>15</TickProblemCD>
        <TicketNum>075020009000048</TicketNum>
        <Total>0</Total>
        <Total0Decimal>0</Total0Decimal>
        <TotalDisplay>0</TotalDisplay>
        <UserNumber>009</UserNumber>
    </Part>
    <Part>
        <Duration>2</Duration>
        <Total>0</Total>
        <PartCost>0.00</PartCost>
        <PartCost0Decimal>0</PartCost0Decimal>
        <PerformedBy>TEST</PerformedBy>
        <WorkDoneCode />
        <WorkDoneDesc />
        <ZoneBasedTravel>False</ZoneBasedTravel>
        <PartNum>Travel</PartNum>
        <PartDescr>---</PartDescr>
        <Qty>2</Qty>
    </Part>
    <Part>
        <Duration>4</Duration>
        <DurationRequired>True</DurationRequired>
        <EndTime>12/4/2008 2:24 PM</EndTime>
        <EndTimeOnly>12/4/2008</EndTimeOnly>
        <FamilyName>NON-COMPLAINT</FamilyName>
        <FOC>False</FOC>
        <InvTxnGenerated />
        <LastUpdatedDate>12/4/2008 2:24 PM</LastUpdatedDate>
        <Rate>0</Rate>
        <Rate0Decimal>0</Rate0Decimal>
        <RateType>Install</RateType>
        <Total>0</Total>
        <PartCost>0.00</PartCost>
        <PartCost0Decimal>0</PartCost0Decimal>
        <PerformedBy>TEST</PerformedBy>
        <WorkDoneCode>17000</WorkDoneCode>
        <WorkDoneDesc>De-Installation / Instrument Move</WorkDoneDesc>
        <ZoneBasedTravel>False</ZoneBasedTravel>
        <PartNum>Labor</PartNum>
        <PartDescr>Install</PartDescr>
        <Qty>4</Qty>
    </Part>
    <Part>
        <Duration>1</Duration>
        <DurationRequired>True</DurationRequired>
        <EndTime>12/4/2008 2:24 PM</EndTime>
        <EndTimeOnly>12/4/2008</EndTimeOnly>
        <FamilyName>NON-COMPLAINT</FamilyName>
        <FOC>False</FOC>
        <InvTxnGenerated />
        <LastUpdatedDate>12/4/2008 2:24 PM</LastUpdatedDate>
        <Rate>0</Rate>
        <Rate0Decimal>0</Rate0Decimal>
        <RateType>TSB/ISA</RateType>
        <Total>0</Total>
        <PartCost>0.00</PartCost>
        <PartCost0Decimal>0</PartCost0Decimal>
        <PerformedBy>TEST</PerformedBy>
        <WorkDoneCode>13000</WorkDoneCode>
        <WorkDoneDesc>TSB / ISA - Installed</WorkDoneDesc>
        <ZoneBasedTravel>False</ZoneBasedTravel>
        <PartNum>Labor</PartNum>
        <PartDescr>TSB/ISA</PartDescr>
        <Qty>1</Qty>
    </Part>
</Parts>

Требуемый результат получен :

7

Редактировать : В комментарии ОП пояснил, что он ищет sum Duration всех part -й, чей PartNumber равен "Труду".

Следующее выражение XPath дает эту сумму :

sum(/*/*[PartNum='Labor']/Duration)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...