标签:
继上次我写了篇文章《在XSLT样式表中使用莱布尼兹级数计算π的近似值》后,我发现在XSLT中使用模板的递归调用,有下面两个缺点:1)易读性差,有失灵活;2)效率低下。因此,我又想了一个新的策略实现在XSLT中的一些复杂的计算工作,这就是在XSLT中嵌入脚本,本文以VBScript为例描述了这一过程
现有XML文档pi.xml如下:
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type=‘text/xsl‘ href=‘pi.xslt‘?> <LOOP COUNT="500000" />
这回的计算次数从上次的10000(一万)次提升到了500000(五十万)次
再建立xslt文件pi.xslt,内容如下:
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:MyVBScript="#MyVBScript"> <msxml:script language="VBScript" implements-prefix="MyVBScript"> <![CDATA[ Function Pi(IterTimes) Dim Result : Result = 0.0 Dim Sign : Sign = 1.0 For i = 1 To IterTimes Result = Result + Sign / (i * 2 - 1) Sign = Sign * (-1) Next Pi = Result End Function ]]> </msxml:script> <xsl:output method="html" /> <!--计算Pi值--> <xsl:template match="/"> <html> <head> <meta content="zh-cn" http-equiv="Content-Language"/> <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/> <title> π的莱布尼茨公式</title> </head> <body> <xsl:text>计算π值 迭代次数:</xsl:text> <xsl:value-of select="/LOOP/@COUNT"/> <hr/> <xsl:text>计算结果为:</xsl:text> <xsl:value-of select="MyVBScript:Pi(string(/LOOP/@COUNT)) * 4"/> </body> </html> </xsl:template> </xsl:stylesheet>
再用IE7打开pi.xml,会有下面的提示信息:
如果点击了按钮“否”,则XML变为不可读:
如果点击了“是”,则会出现下面的页面:
运行后可以发现,这段代码中为计算Pi值一共迭代了500,000次,计算速度反而比《在XSLT样式表中使用莱布尼兹级数计算π的近似值》中迭代10,000次还要快得多。再加上使用VBScript可以处理比XSLT语言更为复杂的逻辑,因此涉及到比较复杂的计算时,我认为嵌入脚本辅助计算的方式更值得使用。
标签:
原文地址:http://my.oschina.net/Tsybius2014/blog/376094