如果我们使用substring函数如何求和

时间:2011-05-23 14:14:24

标签: xslt

如果我们使用子串函数,我想问如何获得总量, 例如,我有这个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:字符串。 (我尝试使用数字函数,但没有帮助)

请告诉我如何解决它。

2 个答案:

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