使用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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
基于PHP实现用户在线状态检测
Nov 10 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中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
微信JS接口大全
2016/08/25 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
python中实现k-means聚类算法详解
2017/11/11 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
幼儿生日活动方案
2014/08/27 职场文书
2015年实习单位评语
2015/03/25 职场文书
房屋产权证明书
2015/06/19 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android