如果我们使用子串函数,我想问如何获得总量, 例如,我有这个xml,
<document>
<line id="0">
<field id="0"><![CDATA[AAAddd17aaass]]></field>
</line>
<line id="1">
<field id="0"><![CDATA[DDDaaa33sssaa]]></field>
</line>
</document>
我应该求和(substring(field [@ id ='0'],7,2))。然后我尝试这样做,我得到这个错误消息:当前项是'NaN类型xs:字符串。 (我尝试使用数字函数,但没有帮助)
请告诉我如何解决它。
答案 0 :(得分:2)
XSLT 2.0中的简单:
sum(field[@id='0']/number(substring(., 7,2)))
在XSLT 1.0中更加困难:例如参见http://www.velocityreviews.com/forums/t170401-sum-over-computed-value.html
答案 1 :(得分:1)
在XSLT 1.0中,如果您不想自己编写递归模板,可以使用transform-and-sum
中的FXSL模板。
了解如何使用 here 。
以下是完整转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:func-transform="f:func-transform"
exclude-result-prefixes="xsl f func-transform"
>
<xsl:import href="transform-and-sum.xsl"/>
<!-- to be applied on testTransform-and-sum.xml -->
<xsl:output method="text"/>
<func-transform:func-transform/>
<xsl:template match="/">
<xsl:call-template name="transform-and-sum">
<xsl:with-param name="pFuncTransform"
select="document('')/*/func-transform:*[1]"/>
<xsl:with-param name="pList" select="/*/*/*"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="func-transform:*" mode="f:FXSL">
<xsl:param name="arg1" select="0"/>
<xsl:value-of select="number(substring($arg1, 7,2))"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<document>
<line id="0">
<field id="0"><![CDATA[AAAddd17aaass]]></field>
</line>
<line id="1">
<field id="0"><![CDATA[DDDaaa33sssaa]]></field>
</line>
</document>
产生了想要的正确结果:
50