使用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连接Oracle数据库
Oct 09 PHP
PHP安装攻略:常见问题解答(一)
Oct 09 PHP
php预定义常量
Dec 25 PHP
php Ajax乱码
Apr 09 PHP
php下封装较好的数字分页方法
Nov 23 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
thinkphp特殊标签用法概述
Nov 24 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
通过代码实例解析PHP session工作原理
Dec 11 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文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
详解JavaScript的变量
2019/04/04 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python交互式图形编程实例(三)
2017/11/17 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
Python类class参数self原理解析
2020/11/19 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
食堂个人先进事迹
2014/01/22 职场文书
公司建议书怎么写
2014/05/15 职场文书
公司合作协议范文
2014/10/01 职场文书
好人好事新闻稿
2015/07/17 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
postgresql中如何执行sql文件
2023/05/08 PostgreSQL