使用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 相关文章推荐
PHP4实际应用经验篇(4)
Oct 09 PHP
打造超酷的PHP数据饼图效果实现代码
Nov 23 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
JavaScript创建命名空间的5种写法
Jun 24 PHP
浅析php创建者模式
Nov 25 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
详解no input file specified 三种解决方法
Nov 29 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实现的获取URL信息的类
2007/01/02 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
零基础php编程好学吗
2019/10/11 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
puppeteer库入门初探
2019/01/09 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
Python使用Supervisor来管理进程的方法
2015/05/28 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
兼职学生的自我评价
2013/11/24 职场文书
合作意向书格式及范文
2014/03/31 职场文书
上课说话检讨书
2015/01/27 职场文书
党员转正党支部意见
2015/06/02 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers