Xslt 如果我们使用子串函数,如何求和

Xslt 如果我们使用子串函数,如何求和,xslt,Xslt,我想问一下,如果我们使用子字符串函数,如何得到总量, 例如,我有一个xml <document> <line id="0"> <field id="0"><![CDATA[AAAddd17aaass]]></field> </line> <line id="1"> <field id="0"><![CDATA[DDDaaa33sssaa]

我想问一下,如果我们使用子字符串函数,如何得到总量, 例如,我有一个xml

<document>

    <line id="0">
        <field id="0"><![CDATA[AAAddd17aaass]]></field>
    </line>
    <line id="1">
        <field id="0"><![CDATA[DDDaaa33sssaa]]></field>
    </line>
</document>

我应该求和(子字符串(字段[@id='0'],7,2))。然后我尝试这样做,我得到这个错误消息:当前项是xs:string类型的'NaN'。(我尝试使用数字功能,但没有帮助)

请告诉我如何解决此问题。

XSLT 2.0中的Easy:

sum(field[@id='0']/number(substring(., 7,2)))
XSLT 1.0中的难度更大:例如,请参见XSLT 2.0中的Easy:

sum(field[@id='0']/number(substring(., 7,2)))

XSLT1.0中的难度更大:例如,请参见XSLT1.0中的

。如果您不想自己编写递归模板,可以使用中的模板

查看如何使用它


以下是完整的转换:

<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>
<document>
    <line id="0">
        <field id="0"><![CDATA[AAAddd17aaass]]></field>
    </line>
    <line id="1">
        <field id="0"><![CDATA[DDDaaa33sssaa]]></field>
    </line>
</document>
50

在XSLT1.0中,如果您不想自己编写递归模板,可以使用中的模板

查看如何使用它


以下是完整的转换:

<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>
<document>
    <line id="0">
        <field id="0"><![CDATA[AAAddd17aaass]]></field>
    </line>
    <line id="1">
        <field id="0"><![CDATA[DDDaaa33sssaa]]></field>
    </line>
</document>
50


帮助意味着什么?这是一个错误还是没有将它们相加?错误是相同的,只是xs:doubleDosent帮助的意思不是“xs:string”而是“xs:string”?这是一个错误还是没有把它们加起来?错误都是一样的,只是用xs:string代替xs:double仍然没有那么难。这是一个rec函数,这就是你对sum的看法,也是你在任何其他语言如SML(或Haskell,流行语)中的看法。@Nicholas,你认为sum是一个递归函数吗?仅在默认使用递归的语言中。大多数出于XML处理需要而使用XSLT的人都不具备编写递归函数的语言背景。+1。或者换句话说,
sum(对于字段[@id='0']中的$item)返回数字(子字符串($item,7,2))
,这对于某些人(比如我)来说可能更容易理解@迈克尔,这相当于你的答案,对吧?很公平。我想我就是那个曾经在XSLT中实现Buchberger算法的人(那时候都是1.0)。递归是XSLT处理模型的关键,但仍然没有那么困难。这是一个rec函数,这就是你对sum的看法,也是你在任何其他语言如SML(或Haskell,流行语)中的看法。@Nicholas,你认为sum是一个递归函数吗?仅在默认使用递归的语言中。大多数出于XML处理需要而使用XSLT的人都不具备编写递归函数的语言背景。+1。或者换句话说,
sum(对于字段[@id='0']中的$item)返回数字(子字符串($item,7,2))
,这对于某些人(比如我)来说可能更容易理解@迈克尔,这相当于你的答案,对吧?很公平。我想我就是那个曾经在XSLT中实现Buchberger算法的人(那时候都是1.0)。递归是XSLT处理模型的关键。@Dimitre Novatchev:在我的情况下如何更改这一行:您的代码?@Petras:这将是:
/*/line[id='0']/field[id='0']
@Dimitre Novatchev:我得到答案。也许我从你的网站下载了不好的模板。我用它来执行这个程序cooktop和xalan-2引擎。下载fxsl-Xalan-1.1.zip。@Petras:fxsl 1.x的Xalan和MSXML版本较旧,我多年前就不再支持它们了。我的猜测是,要使本例的Xalan版起作用,您必须从模板中删除
mode=“f:FXSL”
。@Dimitre Novatchev:我解决了它,没有transform-and-sum.xsl,但您的示例帮助我完成了它。@Dimitre Novatchev:在我的情况下如何更改这一行:您的代码?@Petras:这将是:
/*/line[id='0']/字段[id='0']
@Dimitre Novatchev:我得到了答案。也许我从你的网站下载了不好的模板。我用它来执行这个程序cooktop和xalan-2引擎。下载fxsl-Xalan-1.1.zip。@Petras:fxsl 1.x的Xalan和MSXML版本较旧,我多年前就不再支持它们了。我的猜测是,要使本示例的Xalan版本起作用,您必须从模板中删除
mode=“f:FXSL”
。@Dimitre Novatchev:我解决了它,没有transform-and-sum.xsl,但您的示例帮助我完成了它。