近日研究php+xml+xslt的使用,查阅些许资料,特写一下笔记!
1.配置
拷贝php/dlls目录下的下列文件到windows/system32下
expat.dll
sablot.dll
2.修改php.ini
修改extension_dir指向正确的extension目录
extension_dir = c:/php/extensions
然后找到下面这行
;extension=php_sablot.dll
修改为:
extension=php_sablot.dll
其实就是加载php_sablot模块
3.测试开始了
这是一个php文件,他能够直接将数据库中的东西,转化成xml输出,暂命名test.php
<?php
$myxml = new CMySqlXML("localhost", "root", "", "test");
echo $myxml->run_sql_return_xml("SELECT * FROM astro");
class CMySqlXML {
var $host;
var $user;
var $password;
var $db;
function CMySqlXML($host, $user, $password, $db) {
$this->host = $host;
$this->user = $user;
$this->password = $password;
$this->db = $db;
}
function run_sql_return_xml($sql_string) {
$connection = mysql_connect($this->host, $this->user, $this->password,$this->db);
mysql_select_db($this->db);
$result = mysql_query($sql_string); //结果集
$doc = domxml_open_mem("<root/>"); //创建一个dom对象
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$num_fields = mysql_num_fields($result); //取得列数
$row_element = $doc->create_element(mysql_field_table($result, 0)); //创建表名的元素
$doc_root = $doc->document_element(); //确定root为文档根元素
$row_element = $doc_root->append_child($row_element); //添加列名元素到根文档
for ($i = 0; $i < $num_fields; $i++) {
$field_name = mysql_field_name($result, $i); //取字段名
$col_element = $doc->create_element($field_name); //创建元素
$col_element = $row_element->append_child($col_element);//添加元素
$text_node = $doc->create_text_node(iconv("gb2312","utf-8",$row[$field_name])); //值 为了显示方便特用iconv进行转码
$col_element->append_child($text_node); //添加入值
}
}
mysql_free_result($result);
mysql_close($connection);
//return htmlspecialchars($doc->dump_mem(false));
return $doc->dump_mem(false);
}
}
以下这是个xsl文件,功能就是将xml数据中的两个字段输出
在这里我对xslt和css做一下比较,有利于大家理解xslt
CSS同样可以格式化XML文档,那么有了CSS为什么还需要XSLT呢?因为CSS虽然能够很好的控制输出的样式,比如色彩,字体,大小等,但是它有严重的局限性,就是:
(1) CSS不能重新排序文档中的元素;
(2) CSS不能判断和控制哪个元素被显示,哪个不被显示;
(3) CSS不能统计计算元素中的数据;
换句话说,CSS只适合用于输出比较固定的最终文档。CSS的优点是简洁,消耗系统资源少;而XSLT虽然功能强大,但因为要重新索引XML结构树,所以消耗内存比较多。
因此,我们常常将它们结合起来使用,比如在服务器端用XSLT处理文档,在客户端用CSS来控制显示。可以减少响应时间。
例子中的两个字段为astroid start_date,就是为结果集中字段的名字,根据需要自行修改
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="root/astro">
<tr>
<td><xsl:value-of select="astroid"/></td>
<td><xsl:value-of select="start_date"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
最后当然就是将xml和xsl进行整合,转化成html输出了,一下是php文件
<?php
$xslfile = "htdocs/xml/test.xsl"; //xsl的文件路径,如果是url可参考下行用file_get_contents()进行读取
$xmlString=file_get_contents('http://192.168.8.33/xml/test.php'); //获得xml文件内容
$xh = xslt_create();
//store xmlString in an array using a key '/_xml'
$arguments = array('/_xml' => $xmlString);
echo(xslt_process($xh, 'arg:/_xml', $xslfile, NULL, $arguments));
xslt_free($xh);
?>
以上一个简单的php+xml+xsl的程序就生成了。是一个数据表格
如果将$xslfile = "htdocs/xml/test.xsl"; 改成file_get_contents方式获取,程序就变成以下方式
<?php
$xslfile = file_get_contents('http://192.168.8.33/xml/test.xsl'); //xsl的文件路径,如果是url可参考下行用file_get_contents()进行读取
$xmlString=file_get_contents('http://192.168.8.33/xml/test.php'); //获得xml文件内容
$xh = xslt_create();
//store xmlString in an array using a key '/_xml'
$arguments = array('/_xml' => $xmlString,
'/_xsl' =>$xslfile
);
echo(xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments));
xslt_free($xh);
?>
运行的结果也是一样,先写到这里,接下去,准备仔细了解一下xslt,东西不少,有的研究的。