2011-05-23 78 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

相關問題