以下是<Validation>
标记可以包含{... 1}个<Failed>
标记的XML。
<Header>
...
...
</Header>
<Validation>
<Type>Classic</Type>
<Percentage>10</sPercentage>
<Failed>
<ID>CS-20192018</ID>
<Department>MF404</Department>
<ErrorDescription>Failed at server</ErrorDescription>
</Failed>
<Failed>
<ID>CS-3233333</ID>
<Department>MF404</Department>
<ErrorDescription>Failed at webservice</ErrorDescription>
</Failed>
</Validation>
<Validation>
<Type>CheckMember</Type>
<Percentage>20</Percentage>
<Failed>
<ID>CS-4648902</ID>
<Department>MF404</Department>
<ErrorDescription>Data not available</ErrorDescription>
</Failed>
</Validation>
要求:
我只想根据<Failed>
计算总结百分比。
第一个<Validation>
代码:
Percentage * no of <Failed> count = Result1
10 * 2 = 20
第二个<Validation>
标记:
Percentage * no of <Failed> count = Result2
20 * 1 = 20
Total = Result1 + Result2 = 20 + 20 = 40
因此,我希望将总百分比输出设为40,并且我尝试使用xsl:call-template
方法,但它已经烟消云散了。
请您分享一下代码片段以计算百分比总和?
答案 0 :(得分:1)
<强>予。有不同的XSLT 1.0解决方案:
0.1。非递归,使用xxx:node-set()
函数:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vrtfResults">
<xsl:apply-templates/>
</xsl:variable>
<xsl:value-of select="sum(ext:node-set($vrtfResults)/*)"/>
</xsl:template>
<xsl:template match="Validation">
<x><xsl:value-of select="Percentage * count(Failed)"/></x>
</xsl:template>
</xsl:stylesheet>
当对提供的XML文档应用此转换时(已更正为格式良好):
<t>
<Header>
...
...
</Header>
<Validation>
<Type>Classic</Type>
<Percentage>10</Percentage>
<Failed>
<ID>CS-20192018</ID>
<Department>MF404</Department>
<ErrorDescription>Failed at server</ErrorDescription>
</Failed>
<Failed>
<ID>CS-3233333</ID>
<Department>MF404</Department>
<ErrorDescription>Failed at webservice</ErrorDescription>
</Failed>
</Validation>
<Validation>
<Type>CheckMember</Type>
<Percentage>20</Percentage>
<Failed>
<ID>CS-4648902</ID>
<Department>MF404</Department>
<ErrorDescription>Data not available</ErrorDescription>
</Failed>
</Validation>
</t>
产生了想要的正确结果:
40
0.2。使用原始递归:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="Validation[1]"/>
</xsl:template>
<xsl:template match="Validation[following-sibling::Validation]">
<xsl:param name="pSum" select="0"/>
<xsl:apply-templates select="following-sibling::Validation[1]">
<xsl:with-param name="pSum" select="$pSum +Percentage*count(Failed)"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Validation">
<xsl:param name="pSum" select="0"/>
<xsl:value-of select="$pSum +Percentage*count(Failed)"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一XML文档(上图)时,会产生相同的正确结果:
40
<强> II。 XSLT 2.0(XPath 2.0)解决方案
以下内容也可以指定为一个完全不需要XSLT的单个XPath 2.0表达式:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:sequence select="sum(Validation/(Percentage*count(Failed)))"/>
</xsl:template>
</xsl:stylesheet>
也会产生想要的正确结果:
40