使用PHP和XSL stylesheets转换XML文档


Posted in PHP onOctober 09, 2006

PHP是不少在Web开发领域奋战的勇士们所选用的武器,因为它是一种很直观的编程语言,有强大的函数,良好的跨平台兼容性,还有它是免费的。从网上的小商店到大型企业的网站都能看到PHP的影子。

 
PHP有一点特性经常被人们忽视,那就是和XSL stylesheets合作对XML进行解析的能力。下面就让我们来看看怎样在PHP中设置一个XSL解析器以及你该如何使用这一功能。

例子
列表A是一个简单的订单文档,我们会将这个文档输入XSL解析器。同时,列表B中的XSL stylesheet也会被输入XSL解析器。

Listing A: order.xml

<?xml version="1.0" ?>
<Order>
  <Account>9900234</Account>
  <Item id="1">
    <SKU>1234</SKU>
    <PricePer>5.95</PricePer>
    <Quantity>100</Quantity>
    <Subtotal>595.00</Subtotal>
    <Description>Super Widget Clamp</Description>
  </Item>
  <Item id="2">
    <SKU>6234</SKU>
    <PricePer>22.00</PricePer>
    <Quantity>10</Quantity>
    <Subtotal>220.00</Subtotal>
    <Description>Mighty Foobar Flange</Description>
  </Item>
  <Item id="3">
    <SKU>9982</SKU>
    <PricePer>2.50</PricePer>
    <Quantity>1000</Quantity>
    <Subtotal>2500.00</Subtotal>
    <Description>Deluxe Doohickie</Description>
  </Item>
  <Item id="4">
    <SKU>3256</SKU>
    <PricePer>389.00</PricePer>
    <Quantity>1</Quantity>
    <Subtotal>389.00</Subtotal>
    <Description>Muckalucket Bucket</Description>
  </Item>
  <NumberItems>1111</NumberItems>
  <Total>3704.00</Total>
  <OrderDate>07/07/2002</OrderDate>
  <OrderNumber>8876</OrderNumber>
</Order>
Listing B: order.xsl

<?xml version="1.0"  ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="column" select="'SKU'"/>
 <xsl:param name="order" select="'ascending'"/>
  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates select="Order">
          <xsl:with-param name="sortcolumn" select="$column" />
          <xsl:with-param name="sortorder" select="$order" />
        </xsl:apply-templates>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Order">
    <xsl:param name="sortcolumn" />
    <xsl:param name="sortorder" />
    <table border="1">
      <tr>
        <th>Account</th>
        <th>SKU</th>
        <th>Description</th>
        <th>Price</th>
        <th>Quantity</th>
        <th>Subtotal</th>
      </tr>
      <xsl:apply-templates select="Item">
        <xsl:sort select="*[name()=$sortcolumn]"  order="{$sortorder}" />
      </xsl:apply-templates>
    </table>
  </xsl:template>

  <xsl:template match="Item">
    <tr>
      <td><xsl:value-of select="../Account" /></td>
      <td><xsl:value-of select="SKU" /></td>
      <td><xsl:value-of select="Description" /></td>
      <td><xsl:value-of select="PricePer" /></td>
      <td><xsl:value-of select="Quantity" /></td>
      <td><xsl:value-of select="Subtotal" /></td>
    </tr>
  </xsl:template>   
</xsl:stylesheet>
概述
在这个例子中我们主要用到PHP中的三个XSL函数。首先我们要创建一个XSL引擎的实例,然后把所有要输入的文档输入这个XSL引擎进行处理,并得到返回结果,最后,当我们再也不需要这个XSL引擎时就关闭它。

创建、处理、关闭
我们将要在内存中新建一个XSL进程。为了方便在其他XSL函数中使用这个XSL进程,PHP会给我们提供这个XSL进程的句柄,而不是一个对象。建立这个XSL引擎的命令是xslt_create。函数返回一个句柄,如下所示:

$handle = xslt_create();

为了真正的解析XML文档并使XSLT能够进行处理,你必须使用PHP中的xslt_process函数。这个函数需要获取几个不同的参数。

在这里我们使用一个很基本的方法,为xslt_process提供三个参数。第一个参数是我们较早前创建的那个XSL引擎的句柄。第二个参数是输入的XML文档的文件名。第三个参数是输入的XSL文件的文件名。这个函数会返回处理结果。下面是例子:

$return = xslt_process($handle, $xmlfile, $xslfile);

最后我们要用到的函数是xslt_free。这个函数用来杀掉内存中的XSL引擎实例并释放出内存空间。它只需要一个参数,就是内存中这个XSL实例的句柄。下面是个例子:

xslt_free($handle);

综合实现

下面让我们结合上面的各个代码片断实现PHP通过XSL stylesheets来处理XML文档的方法。我们使用列表A作为我们的输入XML文档,列表B作为我们XSL输入。列表C是这个例子的完整PHP代码:

Listing C: order.php

<?php
$xmlfile = "order.xml";
$xslfile = "order.xsl";
$args = array("column"=>"Quantity", "order"=>"descending");
$engine = xslt_create();
$output = xslt_process($engine, $xmlfile, $xslfile, NULL, NULL, $args);
print $output;
xslt_free($engine);
?>

这里需要注意一点,我们在代码中做了一点变动。在XSL stylesheet中,通过指定一些参数,我们可以改变一些区域,比如地址。这时我们要指定订单上的项目应该按数量递减方式排列。我们使用PHP的数组来存储名字对应我们的参数,然后通过xslt_process函数将名字传递给XSL引擎。

本文作者Brian Schaffner是富士通咨询公司的副主任。他为富士通的技术咨询公司提供架构、设计和开发支持。

 

PHP 相关文章推荐
笑谈配置,使用Smarty技术
Jan 04 PHP
一个很不错的PHP翻页类
Jun 01 PHP
php存储过程调用实例代码
Feb 03 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
PHP中的日期加减方法示例
Aug 21 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
PHP中Http协议post请求参数
Nov 02 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
将PHP作为Shell脚本语言使用
Oct 09 #PHP
PHP分页显示制作详细讲解
Oct 09 #PHP
用PHP调用Oracle存储过程
Oct 09 #PHP
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 #PHP
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 #PHP
PHP在Web开发领域的优势
Oct 09 #PHP
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 #PHP
You might like
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python中的super()方法使用简介
2015/08/14 Python
python开发简易版在线音乐播放器
2017/03/03 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
数控专业应届生求职信
2013/11/27 职场文书
大学生社团活动总结
2014/04/26 职场文书
给老婆道歉的话
2015/01/20 职场文书
大学生个人总结范文
2015/02/15 职场文书
护士自我推荐信范文
2015/03/24 职场文书
赢在执行观后感
2015/06/16 职场文书