Xslt 如果我们使用子串函数,如何求和
我想问一下,如果我们使用子字符串函数,如何得到总量, 例如,我有一个xmlXslt 如果我们使用子串函数,如何求和,xslt,Xslt,我想问一下,如果我们使用子字符串函数,如何得到总量, 例如,我有一个xml <document> <line id="0"> <field id="0"><![CDATA[AAAddd17aaass]]></field> </line> <line id="1"> <field id="0"><![CDATA[DDDaaa33sssaa]
<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,但您的示例帮助我完成了它。