使用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初学入门
Nov 19 PHP
PHP5.3.1 不再支持ISAPI
Jan 08 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
php 解析xml 的四种方法详细介绍
Oct 26 PHP
php中的buffer缓冲区用法分析
May 31 PHP
Laravel框架之解决前端显示图片问题
Oct 24 PHP
PHP加MySQL消息队列深入理解
Feb 27 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
如何做到多笔资料的同步
2006/10/09 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
JS模拟多线程
2007/02/07 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
Python中文件遍历的两种方法
2014/06/16 Python
python日志记录模块实例及改进
2017/02/12 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
大学生的应聘自我评价
2013/12/13 职场文书
中考冲刺决心书
2014/03/11 职场文书
师范生求职信
2014/06/14 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
委托书英文
2015/01/28 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers