当前位置: 首页 > 图文教程 > 网络编程 > PHP > 使用PHP和XSL stylesheets转换XML文档

PHP
利用discuz实现PHP大文件上传应用实例代码
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
php在字符串中查找另一个字符串
php下HTTP Response中的Chunked编码实现方法
PHP实现定时生成HTML网站首页实例代码
PHP下一个非常全面获取图象信息的函数
PHP strtr() 函数使用说明
php 删除无限级目录与文件代码共享
php AJAX实例根据邮编自动完成地址信息
php miniBB中文乱码问题解决方法
cmd下运行php脚本
PHP 遍历XP文件夹下所有文件
php 移除数组重复元素的一点说明
discuz论坛 用户登录 后台程序代码
Optimizer与Debugger兼容性问题的解决方法
Zend Studio 无法启动的问题解决方法
php 页面执行时间计算代码
php smarty的预保留变量总结
php获取网页内容方法总结
php读取msn上的用户信息类

使用PHP和XSL stylesheets转换XML文档


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 243 ::
收藏到网摘: n/a

PHP是不少在Web开发领域奋战的勇士们所选用的武器,因为它是一种很直观的编程语言,有强大的函数,良好的跨平台兼容性,还有它是免费的。从网上的小商店到大型企业的网站都能看到PHP的影子。

PHP有一点特性经常被人们忽视,那就是和XSLstylesheets合作对XML进行解析的能力。下面就让我们来看看怎样在PHP中设置一个XSL解析器以及你该如何使用这一功能。

例子
列表A是一个简单的订单文档,我们会将这个文档输入XSL解析器。同时,列表B中的XSLstylesheet也会被输入XSL解析器。
ListingA:order.xml
<?xmlversion="1.0"?>
<Order>
<Account>9900234</Account>
<Itemid="1">
<SKU>1234</SKU>
<PricePer>5.95</PricePer>
<Quantity>100</Quantity>
<Subtotal>595.00</Subtotal>
<Description>SuperWidgetClamp</Description>
</Item>
<Itemid="2">
<SKU>6234</SKU>
<PricePer>22.00</PricePer>
<Quantity>10</Quantity>
<Subtotal>220.00</Subtotal>
<Description>MightyFoobarFlange</Description>
</Item>
<Itemid="3">
<SKU>9982</SKU>
<PricePer>2.50</PricePer>
<Quantity>1000</Quantity>
<Subtotal>2500.00</Subtotal>
<Description>DeluxeDoohickie</Description>
</Item>
<Itemid="4">
<SKU>3256</SKU>
<PricePer>389.00</PricePer>
<Quantity>1</Quantity>
<Subtotal>389.00</Subtotal>
<Description>MuckalucketBucket</Description>
</Item>
<NumberItems>1111</NumberItems>
<Total>3704.00</Total>
<OrderDate>07/07/2002</OrderDate>
<OrderNumber>8876</OrderNumber>
</Order>
ListingB:order.xsl
<?xmlversion="1.0"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:paramname="column"select="’SKU’"/>
<xsl:paramname="order"select="’ascending’"/>
<xsl:templatematch="/">
<html>
<body>
<xsl:apply-templatesselect="Order">
<xsl:with-paramname="sortcolumn"select="$column"/>
<xsl:with-paramname="sortorder"select="$order"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:templatematch="Order">
<xsl:paramname="sortcolumn"/>
<xsl:paramname="sortorder"/>
<tableborder="1">
<tr>
<th>Account</th>
<th>SKU</th>
<th>Description</th>
<th>Price</th>
<th>Quantity</th>
<th>Subtotal</th>
</tr>
<xsl:apply-templatesselect="Item">
<xsl:sortselect="*[name()=$sortcolumn]"order="{$sortorder}"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:templatematch="Item">
<tr>
<td><xsl:value-ofselect="../Account"/></td>
<td><xsl:value-ofselect="SKU"/></td>
<td><xsl:value-ofselect="Description"/></td>
<td><xsl:value-ofselect="PricePer"/></td>
<td><xsl:value-ofselect="Quantity"/></td>
<td><xsl:value-ofselect="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通过XSLstylesheets来处理XML文档的方法。我们使用列表A作为我们的输入XML文档,列表B作为我们XSL输入。列表C是这个例子的完整PHP代码:
ListingC: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);
?>
这里需要注意一点,我们在代码中做了一点变动。在XSLstylesheet中,通过指定一些参数,我们可以改变一些区域,比如地址。这时我们要指定订单上的项目应该按数量递减方式排列。我们使用PHP的数组来存储名字对应我们的参数,然后通过xslt_process函数将名字传递给XSL引擎。