使用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 相关文章推荐
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php防止sql注入代码实例
Dec 18 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
ThinkPHP分页实例
Oct 15 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
php curl操作API接口类完整示例
May 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
PHP语法速查表
2006/12/06 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
JS array数组检测方式解析
2020/05/19 Javascript
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python 字典中的所有方法及用法
2020/06/10 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
祖国在我心中演讲稿400字
2014/05/04 职场文书
心理学专业求职信
2014/06/16 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
母亲节寄语大全
2015/02/27 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
如何用Python搭建gRPC服务
2021/06/30 Python