2012-04-12 55 views

回答

0

在XSLT 2.0本可以通过使用tokenize()number()sum()函数来完成,例如以下。请注意,我在+标志周围包含了可能的空格。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:variable name="test1">1+1+0</xsl:variable> 
    <xsl:variable name="test2"> 3 + 
    5 +   12 </xsl:variable> 

    <xsl:template match="/"> 
     <xsl:variable name="testSplit1" select="tokenize($test1,'\s*\+\s*')"/> 
     <xsl:variable name="testSplitNum1"> 
      <xsl:for-each select="$testSplit1"> 
       <item><xsl:value-of select="number(.)"/></item> 
      </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="testSplit2" select="tokenize($test2,'\s*\+\s*')"/> 
     <xsl:variable name="testSplitNum2"> 
      <xsl:for-each select="$testSplit2"> 
       <item><xsl:value-of select="number(.)"/></item> 
      </xsl:for-each> 
     </xsl:variable> 

     <root> 
      <items1><xsl:copy-of select="$testSplitNum1"/></items1> 
      <sum1><xsl:value-of select="sum($testSplitNum1/item)"/></sum1> 
      <items2><xsl:copy-of select="$testSplitNum2"/></items2> 
      <sum2><xsl:value-of select="sum($testSplitNum2/item)"/></sum2> 
     </root> 

    </xsl:template> 

</xsl:stylesheet> 

结果(带虚设输入文件)是

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <items1> 
     <item>1</item> 
     <item>1</item> 
     <item>0</item> 
    </items1> 
    <sum1>2</sum1> 
    <items2> 
     <item>3</item> 
     <item>5</item> 
     <item>12</item> 
    </items2> 
    <sum2>20</sum2> 
</root> 
+0

作品完美:)谢谢 – Gust 2012-04-12 23:22:43

+0

但只适用于非常有限的表达类! – 2012-04-15 16:54:59

1

有一个在XSLT 1.0或XSLT 2.0没有通用的机制,以评估作为字符串值提供的XPath表达式。许多产品都有一个扩展来做到这一点(例如参见saxon:evaluate())。 XSLT 3.0中引入了一个通用机制:xsl:evaluate指令。

相关问题