可能有更优雅的方式(我猜sum()
:),但以下工作,通过“折叠”兄弟姐妹加法。终止条件是最后一个兄弟节点(即没有后续节点)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/EmpCollection">
<result>Result Is : <xsl:apply-templates select="Emp[1]"/>
</result>
</xsl:template>
<xsl:template match="Emp[following-sibling::Emp]">
<xsl:variable name="salThis">
<xsl:value-of select="Sal"/>
</xsl:variable>
<xsl:variable name="salOthers">
<xsl:apply-templates select="following-sibling::Emp[position()=1]"/>
</xsl:variable>
<xsl:value-of select="$salThis + $salOthers"/>
</xsl:template>
<!--Termination - the last employee just returns its salary value-->
<xsl:template match="Emp[not(following-sibling::Emp)]">
<xsl:value-of select="Sal"/>
</xsl:template>
</xsl:stylesheet>
给出结果:
<result>Result Is : 32300</result>
编辑
再次阅读您的问题后,我想这不是代码高尔夫问题?下面是使用硬编码元素名称执行此操作的更简单方法,它指示处理器将指定员工的工资加在一起:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/EmpCollection">
<result>
Result Is : <xsl:value-of select="Emp[Name='Sai']/Sal + Emp[Name='Nari']/Sal + Emp[Name='Hari']/Sal + Emp[Name='Suri']/Sal"/>
</result>
</xsl:template>
</xsl:stylesheet>
然后应该很容易理解sum()
正在做什么:
<xsl:template match="/EmpCollection">
<result>
Result Is : <xsl:value-of select="sum(Emp/Sal)"/>
</result>
</xsl:template>
编辑
计数很简单:
<xsl:template match="/EmpCollection">
<result>
<xsl:text>Count Is : </xsl:text>
<xsl:value-of select="count(Emp)"/>
</result>
</xsl:template>
做到这count()
一点并不那么简单。请注意,xsl:variable
s 一旦分配就不能更改(不可变)。所以以下根本不起作用。
<xsl:template match="/EmpCollection">
<xsl:variable name="count" select="0" />
<xsl:for-each select="Emp">
<!--NB : You can't do this. Variables are immutable - XSLT is functional -->
<xsl:variable name="count" select="$count + 1"></xsl:variable>
</xsl:for-each>
<result>
Result Is : <xsl:value-of select="$count"/>
</result>
</xsl:template>
因此,您可以“循环”所有节点,然后用于position()
确定这是否是序列中的最后一个节点。(请注意,我们已经使用过for-each
,但实际上最好使用 use apply-template
)
<xsl:template match="/EmpCollection">
<result>
<xsl:text>Count Is : </xsl:text>
<xsl:for-each select="Emp">
<xsl:if test="position() = last()">
<xsl:number value="position()" format="1" />
</xsl:if>
</xsl:for-each>
</result>
</xsl:template>
:(