Xml 在XSLT模板中求和总数时出现问题

Xml 在XSLT模板中求和总数时出现问题,xml,xslt,Xml,Xslt,我在尝试使用XSLT简单求和一些值时遇到了问题。我在线创建了一个模板,并根据需要对其进行了修改。() 无论我如何尝试,我都无法让模板对数字求和。我要么得到总数为“0”,要么得到我想要求和的数字的串联。如果有人能看一看并指出我的错误所在,我将不胜感激 谢谢 **模板** print("<xsl:template match="Parts"> <root> <xsl:variable name="tmpTotal">

我在尝试使用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>");
打印(“
0000-A123
0
0
... 
2.
假的
假的
15
075020009000048
0
0
0
009
2.
0
0
0
试验
假的
旅行
--- 
2.
4.
真的
12/4/2008下午2:24
12/4/2008 
不抱怨
假的
12/4/2008下午2:24
0
0
安装
0
0
0
试验
17000
拆卸/仪器移动
假的
劳动
安装
4.
1.
真的
12/4/2008下午2:24
12/4/2008 
不抱怨
假的
12/4/2008下午2:24
0
0
TSB/ISA
0
0
0
试验
13000
TSB/ISA-已安装
假的
劳动
TSB/ISA
1.
");

您没有准确解释要求和的值

从给出的XSLT代码判断,似乎您需要所有“Duration”元素的值之和。这可以使用以下简单的XPath表达式获得:

总和(/*/*/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> <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> 当此转换应用于提供的XML文档时

<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> <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> 0000-A123 0 0 ... 2. 假的 假的 15 075020009000048 0 0 0 009 2. 0 0 0 试验 假的 旅行 --- 2. 4. 真的 12/4/2008下午2:24 12/4/2008 不抱怨 假的 12/4/2008下午2:24 0 0 安装 0 0 0 试验 17000 拆卸/仪器移动 假的 劳动 安装 4. 1. 真的 12/4/2008下午2:24 12/4/2008 不抱怨 假的 12/4/2008下午2:24 0 0 TSB/ISA 0 0 0 试验 13000 TSB/ISA-已安装 假的 劳动 TSB/ISA 1. 产生所需结果

<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> <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

编辑:在一篇评论中,OP解释说,他希望对所有
零件的
持续时间
求和,这些零件的
零件号
等于“人工”

以下XPath表达式生成此总和:

<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> <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>
总和(/*/*[PartNum='labour']/Duration)

+1,并应接受回答。我特别想了解如何在xsl中执行总计。但看起来Dave关闭了他的账户。