2011-05-23 36 views
0

我要问,如果我们使用字符串函数, 例如我有这样的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))。然后我试图做到这一点,我得到这个错误消息:当前项目是'NaN类型xs:string。 (我尝试使用数字功能,但它并不能帮助)

请咨询我如何解决这个问题。

+0

Dosent帮助手段?它是一个错误,还是不总结它们? – 2011-05-23 14:28:40

+0

错误是一样的,只是而不是'xs:string'写了xs:double – Petras 2011-05-23 14:32:49

回答

1

在XSLT 1.0,如果你不想自己写递归模板,你可以使用来自FXSLtransform-and-sum模板。

查看如何使用它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 
+0

@Dimitre Novatchev:如何在我的情况下更改这行:你的代码? – Petras 2011-05-24 12:07:13

+0

@Petras:这将是:'/ * /线[ID = '0'] /场[ID = '0']' – 2011-05-24 12:43:51

+0

@Petras:'/ */* /字段[@ ID = '0']' - 今天早上我睡得很熟... – 2011-05-24 12:52:25

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

+0

还是没那么难。这是一个rec函数,无论如何,这就是你如何看待总和的方式,这就是你如何使用SML(或Haskell,对于时髦)等其他语言来完成这项工作。 – 2011-05-23 18:17:44

+0

@Nicholas,你认为sum是一个递归函数?只有在递归是默认语言的情况下。大多数来到XSLT处理XML处理需求的人都没有这种语言背景,不容易找到写递归函数。 – LarsH 2011-05-23 19:37:32

+0

+1。或者换句话说,总和(对于字段[@ id ='0']中的$ item返回 number(substring($ item,7,2)))'',这对某些人来说可能更易于理解(像我这样的)。 @迈克尔,这相当于你的答案,对吗? – LarsH 2011-05-23 19:43:24

相关问题