如何获得for-each循环中所有项目的总成本? ?xml version="1.0" encoding="utf-8" ?Characters Character ID="1" Name="Simmo" Inventory MaxSlots="20" Item ID="1" Name="Gold" Cost="1" Count100/Count /Item Item ID="1" Name="hat" Cost
<?xml version="1.0" encoding="utf-8" ?> <Characters> <Character ID="1" Name="Simmo"> <Inventory MaxSlots="20"> <Item ID="1" Name="Gold" Cost="1"> <Count>100</Count> </Item> <Item ID="1" Name="hat" Cost="10"> <Count>1</Count> </Item> <Item ID="2" Name="stick" Cost="15"> <Count>2</Count> </Item> </Inventory> </Character> </Characters>
例如1 * 100 10 * 1 15 * 2 = 140
我未完成的xsl解决方案:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <html> <head> <title>xsl file</title> </head> <body> <ul> <xsl:for-each select="/Characters/Character"> <li> Character name: <xsl:value-of select="@Name"/> <br/> <xsl:for-each select="Inventory/Item"> <xsl:variable name="cos" select="@Cost"/> <xsl:variable name="cou" select="Count"/> <xsl:variable name="kor" select="$cos*$cou"/> Total cost:<xsl:value-of select="$kor"/> <br/> </xsl:for-each> <br /> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet>
当前输出:
人物名称:Simmo
总费用:100
总费用:10
总费用:30
但如何获得角色名称:Simmo总费用:140
三种可能性:(1)转到XSLT 2.0并编写
Character name: <xsl:value-of select="@Name"/> <br/> Total cost: <xsl:value-of select=" sum(for $i in Inventory/Item return $i/@Cost * $i/Count) "/>
(2)在XSLT 1.0中,使用已经指向的related question中详细描述的EXSLT节点集扩展(a)创建一组包含@Cost和Count的乘积的节点,以及(b)求和它们.
(3)编写递归命名模板以循环遍历项目集,计算运行总计.这看起来像这样(未经测试):
<xsl:template match="/"> ... some of your code omitted here ... <xsl:for-each select="/Characters/Character"> <li> Character name: <xsl:value-of select="@Name"/> <br/> <xsl:call-template name="sum-items"> <xsl:with-param name="item" select="Inventory/Item[1]"/> <xsl:with-param name="accumulator" select="0"/> </xsl:call-template> <br /> </li> </xsl:for-each> ... </xsl:template> <xsl:template name="sum-items"> <xsl:param name="item"/> <xsl:param name="accumulator"/> <xsl:choose> <xsl:when test="not($item)"> <!--* done, return result *--> Total cost: <xsl:value-of select="$accumulator"/> </xsl:when> <xsl:otherwise> <xsl:variable name="acc" select="$accumulator + ($item/@Cost * $item/Count)"/> <xsl:call-template name="sum-items"> <xsl:with-param name="item" select="$item/following-sibling::item[1]"/> <xsl:with-param name="accumulator" select="$acc"/> </xsl:call-template> </xsl:otherwise> </xsl:when> </xsl:template>