在XSLT样式表中使用莱布尼兹级数计算π的近似值

初学XSLT的时候一直纠结它对循环的处理,一开始使用for-each进行简单的遍历操作,但是对更精确的循环控制总感觉力不从心。后来我在《XSLT从入门到精通》这本书中看到了一个概念“Side-Effect-Free”-基本意思就是用户不能更新变量值,因此用户对于控制函数环境只有非常有限的能力-才知道XSLT中的variable的值是无法进行二次修改的。因此,类似高级语言(如C++)中如“for(int i = 0; i < n; i++) { }”里的变量i,就不能实现了。后来我又研究了下,XSLT的循环是通过对模板(template)的递归实现的。下面是一段我写的计算圆周率的XSLT代码,使用莱布尼茨级数(Leibniz series)递归求出π/4的近似值,然后输出它的4倍即π的近似值。

1.XML文件“loop.xml”的代码

下面代码中COUNT指定递归次数,即“loop.xslt”中模板CALCULATE的调用次数

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type=‘text/xsl‘ href=‘loop.xslt‘?>
<LOOP COUNT="10000" />

2.XSLT文件“loop.xslt”的代码

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" />
  
  <!--递归计算Pi值-->
  <xsl:template name="CALCULATE">
    <xsl:param name="LOOP"/>
    <xsl:param name="COUNT"/>
    <xsl:param name="SIGN"/>
    <xsl:param name="VALUE"/>
    
    <xsl:if test="number($LOOP) &lt; number($COUNT) + 1">
      <xsl:value-of select ="number($VALUE) * 4"/>
      <xsl:text>, </xsl:text>
      <xsl:call-template name="CALCULATE">
        <xsl:with-param name="LOOP" select="number($LOOP) + 1"/>
        <xsl:with-param name="COUNT" select="number($COUNT)"/>
        <xsl:with-param name="SIGN" select="number($SIGN) * (-1)"/>
        <xsl:with-param name="VALUE" select="number($VALUE) + number($SIGN) div (number($LOOP) * 2 + 1)"/>
      </xsl:call-template>
    </xsl:if>
  
  </xsl:template>
    
  <!--计算Pi值-->
  <xsl:template match="/">
    
    <xsl:variable name="INIT_LOOP" select="1"/>
    <xsl:variable name="INIT_COUNT" select="/LOOP/@COUNT"/>
    <xsl:variable name="INIT_SIGN" select="-1"/>
    <xsl:variable name="INIT_VALUE" select="1"/>
      
    <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="$INIT_COUNT"/>
        
        <hr/>
        
        <xsl:variable name="RESULT" >
          <xsl:call-template name="CALCULATE">
            <xsl:with-param name="LOOP" select="$INIT_LOOP"/>
            <xsl:with-param name="COUNT" select="$INIT_COUNT"/>
            <xsl:with-param name="SIGN" select="$INIT_SIGN"/>
            <xsl:with-param name="VALUE" select="$INIT_VALUE"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$RESULT"/>
        <xsl:text>...</xsl:text>
      
        </body>
      </html>
  
  </xsl:template>

</xsl:stylesheet>

3.loop.xml打开后的效果

这个程序迭代10000次后,得出的结果为:3.1414926535900345

附:几个维基百科上的条目

1)函数的副作用:https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29

2)π的莱布尼茨公式:https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80

END

时间: 2025-01-05 22:31:13

在XSLT样式表中使用莱布尼兹级数计算π的近似值的相关文章

在XSLT样式表中插入VBScript脚本进行数学计算

继上次我写了篇文章<在XSLT样式表中使用莱布尼兹级数计算π的近似值>后,我发现在XSLT中使用模板的递归调用,有下面两个缺点:1)易读性差,有失灵活:2)效率低下.因此,我又想了一个新的策略实现在XSLT中的一些复杂的计算工作,这就是在XSLT中嵌入脚本,本文以VBScript为例描述了这一过程 现有XML文档pi.xml如下: <?xml version="1.0" encoding="utf-8"?> <?xml-styleshe

微软BI 之SSIS 系列 - XML Task 中XSLT 样式表转换错误记录

开篇介绍 此文章专门记录 XSLT 样式表转换过程中的语法问题 错误一 值与属性的倒置 修改了几次样式表,但还是一如既往的报错,报错信息如下: [XML Task] Error: An error occurred with the following error message: "Attribute and namespace nodes cannot be added to the parent element after a text, comment, pi, or sub-eleme

用XSLT样式表加工后的XML显示DBF文件内容

1.程序需求 在NAS上(可以理解为局域网上一个存放了若干文件的IP地址),有若干个DBF文件,它们占用的空间都不大.现在要做一个功能,就是把这些文件每隔一段时间,做一个快照,以XML形式保存DBF文件的值.并把XML文档保存到指定位置,用已经写好的XSLT样式表,来显示这个XML文件,并提供一些XML文件的统计信息. 2.我的架构 DbfMonitor(程序根目录) | |-dbfs(目录) | | | |-dbf1(目录) | | |-dbf1.dbf | |-dbf2(目录) | | |-

css样式表中设置table的第一列的宽度是固定值

table{table-layout:fixed;}table tr td:first-child,table tr td:first-child{width:120px;} 首行第一个td定宽同列的宽度都会和他一样. *注意 第一行 第一个用的是 td 还是 th css样式表中设置table的第一列的宽度是固定值,布布扣,bubuko.com

css样式表中的样式覆盖顺序(转)

转自:http://spartan1.iteye.com/blog/1526735 有时候在写CSS的过程中,某些限制总是不起作用,这就涉及了CSS样式覆盖的问题,如下 Css代码 #navigator { height: 100%; width: 200; position: absolute; left: 0; border: solid 2 #EEE; } .current_block { border: solid 2 #AE0; } 查找一些教材中(w3schools等),只说css的

Andriod React Native 样式表中可用样式属性

写了这么多篇Android React Native的博文,基本上把复杂的东西都搞定了,接下来来看看一些轻松的东西,和布局有关,就是css样式,那么一个View可以设置哪些css样式呢,是和web中的css样式完全一样呢,还是有所不同呢?其实你只要在样式表中书写一个不存在的样式,就会报一大堆错,提示你该样式不存在,然后提供所有可用的样式给你,如图 下面的样式就是样式表中所有可用的属性. "alignItems", "alignSelf", "backfac

css样式表中四种属性选择器

css样式表中四种属性选择器1> 简易属性 tag[class]{ font-weight:bold } It will affect all tag with any class. e.g. <h2 class="old" > or <h2 class="new"> 2>精确属性值 a[href="http://www.cnblogs.cn"][title="textTitle"]{fon

css样式表中的样式覆盖顺序

css样式表中的样式覆盖顺序 - - ITeye技术网站http://spartan1.iteye.com/blog/1526735 重点归纳: 查找一些教材中(w3schools等),只说css的顺序是“元素上的style”>“文件头上的style元素”>“外部样式文件”,但对于样式文件中的多个相同样式的优先级怎样排列,没有详细说明.经过测试和继续搜索,得知优先级如下排列: 或者以下也可以称之为一些优先原则(by liwei 20140803) 1.样式表的元素选择器选择越精确,则其中的样式

自定义类StyleSheet跨浏览器操作样式表中的规则

这是群里网友地瓜提供的一个类,不熟悉样式的浏览器差异的可以看看 /** * Stylesheet.js: utility methods for scripting CSS stylesheets. * * This module defines a Stylesheet class that is a simple wrapper * around an element of the document.styleSheets[] array. It defines useful * cross