国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

用PHP解析XSL

用PHP解析XSL

更新時間:2022-04-29 文章作者:未知 信息來源:網絡 閱讀次數:

用PHP解析XSL

在php的應用當中,為做到數據和代碼分離需要使用模板技術。pear、phplib及不少公司都提供了相關的模板。但他們有一個共同的缺點:就是沒有統一的規范,給使用者帶來很多不便。另外有關的教程和范例較少,也太初淺,不易做深層次的開發應用。
XSL是W3C組織的規范標準,隨著XML的應用而發展起來。其教程隨處可見,只要你有ie5就可使用。當然由于是新技術,在支持程度上尚顯不足。
這里給大家介紹一種用用PHP解析XSL的方法。該方法僅使用PHP提供的XML函數,無須難以配置的XSLT。
先看一下例子。
將以下內容保存為resume.xml
<?xml version="1.0" encoding="GB2312"?>
<?xml:stylesheet type="text/xsl" href="resume2.xsl"?>
<document>
<resume>
<alias>嘮叨</alias>
<name>徐祖寧</name>
<sex>男</sex>
<birthday>1948.10</birthday>
<addr>安徽</addr>
<email>czjsz_ah@stats.gov.cn</email>
<icq> </icq>
<oicq> </oicq>
<skill>C/C++、VFP、PHP、JavaScript</skill>
<homepage> </homepage>
<date>2001-7-19</date>
</resume>
<resume>
<alias>刁饞</alias>
<name>保密</name>
<sex>男</sex>
<birthday> </birthday>
<addr>黑龍江</addr>
<email>yuepengfei@mail.banner.com.cn</email>
<icq>166581208</icq>
<oicq>7665656</oicq>
<skill> </skill>
<homepage> </homepage>
<date>2001-8-15</date>
</resume>
<resume>
<alias>sports98</alias>
<name>保密</name>
<sex>男</sex>
<birthday> </birthday>
<addr>四川</addr>
<email>flyruns@hotmail.com</email>
<icq>15787767</icq>
<oicq>11599322</oicq>
<skill> </skill>
<homepage>http://www.hiviresearch.com/cgi/report/</homepage>
<date>2002-1-5</date>
</resume>
</document>

將以下內容保存為resume1.xsl
<?xml version="1.0" encoding="GB2312"?>
<HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<HEAD>
<TITLE>個人簡歷</TITLE>
</HEAD><BODY>
<TABLE border="1" cellspacing="0" style="font-size:10pt">
<CAPTION style="font-size: 110%; font-weight: bold">
版主信息
</CAPTION>
<xsl:for-each select="document">
<TR>
<TH>別名</TH>
<TH>姓名</TH>
<TH>性別</TH>
<TH>所在地</TH>
<TH>專長</TH>
</TR>
<xsl:for-each select="resume">
<TR>
<TD><xsl:value-of select="alias"/></TD>
<TD><xsl:value-of select="name"/></TD>
<TD><xsl:value-of select="sex"/></TD>
<TD><xsl:value-of select="addr"/></TD>
<TD><xsl:value-of select="skill"/></TD>
</TR>
</xsl:for-each>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>

將以下內容保存為resume2.xsl
<?xml version="1.0" encoding="GB2312"?>
<HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<HEAD>
<TITLE>個人簡歷</TITLE>
</HEAD><BODY>
<xsl:for-each select="document">
<xsl:for-each select="resume">
<TABLE border="1" cellspacing="0" style="font-size:10pt">
<CAPTION style="font-size: 110%; font-weight: bold">
版主信息
</CAPTION>
<TR>
<TH>別名</TH><TD><xsl:value-of select="alias"/></TD>
<TH>姓名</TH><TD><xsl:value-of select="name"/></TD>
<TH>性別</TH><TD><xsl:value-of select="sex"/></TD>
<TH>所在地</TH><TD><xsl:value-of select="addr"/></TD>
</TR>
<TR>
<TH>加入時間</TH>
<TD colspan="7"><xsl:value-of select="date"/></TD>
</TR>
<TR>
<TH>專長</TH>
<TD colspan="7"><xsl:value-of select="skill"/></TD>
</TR>
<TR>
<TH>ICQ</TH>
<TD colspan="7"><xsl:value-of select="icq"/></TD>
</TR>
<TR>
<TH>OICQ</TH>
<TD colspan="7"><xsl:value-of select="oicq"/></TD>
</TR>
<TR>
<TH>主頁</TH>
<TD colspan="7"><xsl:value-of select="homepage"/></TD>
</TR>
</TABLE>
</xsl:for-each>
</xsl:for-each>
</BODY>
</HTML>

在ie5以上瀏覽器上查看resume.xml,并可修改resume.xml中<?xml:stylesheet type="text/xsl" href="resume2.xsl"?> 的resume2.xsl為resume1.xsl,可看到頁面的變化。當然由于不是所有的瀏覽器都支持這個轉換,所以需要在服務器上進行轉換。

將以下內容保存為xmltest.php
<?php
require_once "xsl_class.php";
$xml = new XML;
$p = new XSL;
$p->parser("resume2.xsl",$xml->parser("resume.xml"));
$p->display();
?>
變換其中的resume2.xsl,我們仍將看到不同的頁面,只是以轉變成HTML格式了。

 相關的類:
 類xml_class解析xml文檔產生一個類似于domxml的結構
 類xsl_class派生于xml_class,用于解析xsl文檔并模擬xsl函數,其中template尚未實現。
*****************
 xml_class.php
*****************
<?php
class Element {
var $Element;// 這種節點用于文檔中的任何元素。元素節點的子節點可以是其內容的元素節點、注釋節點、處理信息節點以及文本節點。
var $Text;// 文檔中出現的所有文本,都分組歸入到文本節點中。文本節點不可以有同為文本節點的緊接著的前或后的兄弟節點。
var $Attribute; // 每一個元素節點都有一套自己附加的屬性節點。默認的屬性值以與指定屬性一樣的方法來處理。這些節點都沒有子節點。
var $Namespace; // 對于每一個以xlmns:和屬性節點開頭的元素,都有一個名稱空格節點。這些節點沒有子節點。
var $ProcessingInstruction; // 每一個處理指令都有一個單獨的節點。這些節點都沒有子節點。
var $Comment; // 每一個都有一個注釋節點。這些節點都沒有子節點。
var $parents = array();
var $childs = array();
}

class xml {
var $tm = array();
var $xml_parser;
var $data = array();
var $element = ""; // 當前節點
var $stack = array(); // 緩存當前標頭的相關參數
var $type;

function trustedFile($file) {
// only trust local files owned by ourselves
if (!eregi("^([a-z]+)://", $file)
&& fileowner($file) == getmyuid()) {
return true;
}
return false;
}

//處理元素的開始標頭
function startElement($parser, $name, $attribs) {
if($this->element != "") {
array_push($this->stack,$this->element);
}
$this->element = array(Name => $name);
if(sizeof($attribs)) {
$this->element[Attribute] = $attribs;
}
}

//處理元素的結束標頭
function endElement($parser, $name) {
$element = array_pop($this->stack);
if(is_array($element)) {
$element[Element][] = $this->element;
$this->element = $element;
}else {
$this->data[Root] = $this->element;
$this->element = "";
}
}

//處理字元資料標頭
function characterData($parser, $data) {
$data = eregi_replace("^ +","",$data);
$data = eregi_replace("^\n+","",$data);
if(strlen($data) > 0) {
$this->element[Text] .= $data;
}
}

//處理指令標頭
function PIHandler($parser, $target, $data) {
switch(strtolower($target)) {
case "php":
global $parser_file;
// If the parsed document is "trusted", we say it is safe
// to execute PHP code inside it.If not, display the code
// instead.
if($this->trustedFile($parser_file[$parser])) {
eval($data);
} else {
$this->tm[] = sprintf("Untrusted PHP code: <i>%s</i>",
htmlspecialchars($data));
}
break;
default:
//echo $target;
//echo "==".$data;
//echo printf("%s %s",$target,$data);
break;
}
}

//處理內定標頭
function defaultHandler($parser, $data) {
if(substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
$this->tm[] = sprintf('<font color="#aa00aa">%s</font>',
htmlspecialchars($data));
}else {
$this->tm[] = sprintf('<font size="-1">%s</font>',
htmlspecialchars($data));
}
}

//處理外部實體參引標頭
function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) {
if ($systemId) {
$p = new xml;
return $p->parser($systemId);
}
return false;
}

function parser($file) {
global $parser_file;

if(!($fp = @fopen($file, "r"))) {
return false;
}
$this->xml_parser = xml_parser_create();
xml_set_object($this->xml_parser, &$this);//使 XML 剖析器用對象

xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, 1);
xml_set_element_handler($this->xml_parser, "startElement", "endElement");
xml_set_character_data_handler($this->xml_parser, "characterData");
xml_set_processing_instruction_handler($this->xml_parser, "PIHandler");
xml_set_default_handler($this->xml_parser, "defaultHandler");
xml_set_external_entity_ref_handler($this->xml_parser, "externalEntityRefHandler");

$this->type = xml_parser_get_option($this->xml_parser, XML_OPTION_CASE_FOLDING);
while($data = fread($fp, 4096)) {
if(!xml_parse($this->xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
return false;
}
}
xml_parser_free($this->xml_parser);
return $this->data;
}
}
?>

********************
xsl_class.php
********************

<?php
require_once "xml_class.php";

class xsl extends xml {
var $datastack = array();
var $sp;
function parser($file,$dsn=null) {
parent::parser($file);
if($dsn != null) {
$this->dsn[Element][0] = $dsn[Root];
}
}
//處理元素的開始標頭
function startElement($parser, $name, $attribs) {
if(eregi("^XSL:",$name)) {
$ar = split(":",$name);
return array_push($this->data,array(xsl => $ar[1],command => $attribs));
}
if(sizeof($attribs)) {
$att = "";
while(list($k, $v) = each($attribs)) {
$att .= " $k=\"$v\"";
}
array_push($this->data,array(tag => "$name$att"));
}else
array_push($this->data,array(tag => "$name"));
}

//處理元素的結束標頭
function endElement($parser, $name) {
if(!eregi("^XSL:",$name)) {
array_push($this->data,array(tag => "/$name"));
}else {
$ar = split(":",$name);
array_push($this->data,array(xsl => "/$ar[1]"));
}
}

//處理字元資料標頭
function characterData($parser, $data) {
$data = eregi_replace("^[ \n]+","",$data);
if(strlen($data) > 0) {
array_push($this->data,array(text => "$data"));
}
}

//處理指令標頭
//function PIHandler($parser, $target, $data) {
//}

//處理內定標頭
function defaultHandler($parser, $data) {
}

//處理外部實體參引標頭
//function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) {
//}

// XSL指令解析
function xsl_parser($i) {
for(;$i<count($this->data);$i++) {
$key = $this->data[$i];
if(isset($key[xsl]))
if(eregi("/xsl",$key[xsl]))
return $i;
}
}

// 從數據源讀取數據
function get_data($ps) {
if(! eregi("/",$ps)) {
// 若是默認的層次
$ps = join("/",$this->datastack)."/$ps";
}
return "[$ps]";
}

// 輸出結果
function display() {
$this->stack = array();//初始化控制棧
$this->datastack = array();//初始化數據棧

$type = true;//用于控制text項的輸出
for($id=0;$id<count($this->data);$id++) {
$expr = $this->data[$id];
list($key,$value) = each($expr);
switch($key) {
case "tag":
echo "<".$value.">";
if(eregi("^/",$value))
echo "\n";
break;
case "text":
if($type)
echo $value;
break;
case "xsl":
//echo $value;
list(,$command) = each($expr); // 取得操作集
$value = eregi_replace("[/-]","_",strtolower($value));
if(eregi("eval",$value))
$value = eregi_replace("eval","xsl_eval",$value);
$this->$value($command,$id);
break;
}
}
}
// 檢索數據,$dsn開始的節點,$field節點名,$n匹配次數
function find($dsn,$field,$n=0) {
if(! isset($dsn[Element]))
return false;
$root = $dsn[Element];
for($i=0;$i<count($root);$i++) {
if($this->type) {
if(eregi("^".$field."$",$root[$i][Name])) {
if(!$n--)
return $root[$i];
}
}else {
if(ereg("^".$field."$",$root[$i][Name])) {
if(!$n--)
return $root[$i];
}
}
}
for($i=0;$i<count($root);$i++) {
if($ar = $this->find($root[$i],$field,&$n))
return $ar;
}
return false;
}

function for_each($command,&$id) {
// 循環,將當前id壓入堆棧
array_push($this->stack,array($id,$command[SELECT],1));
// 檢索數據指針
$data = $this->find($this->dsn,$command[SELECT]);
// 數據指針壓入堆棧
array_push($this->datastack,$data);
}
function _for_each($command,&$id) {
// 取得入口地址
$ar = array_pop($this->stack);
// 拋棄當前數據指針
array_pop($this->datastack);
// 檢查是否為嵌套
if(count($this->datastack) > 0) {
$dsn = array_pop($this->datastack);
array_push($this->datastack,$dsn);
}else
$dsn = $this->dsn;
$n = $ar[2];
// 檢索數據指針
$data = $this->find($dsn,$ar[1],$n);
if($data) {
// 如檢索到,則循環
$ar[2]++;
array_push($this->datastack,$data);
array_push($this->stack,$ar);
$id = $ar[0];
}
}
function value_of($command) {
// 取得數據指針
if(eregi("/",$command[SELECT])) {
}else {
if(count($this->datastack) > 0) {
$dsn = array_pop($this->datastack);
array_push($this->datastack,$dsn);
}else
$dsn = $this->dsn;
$data = $this->find($dsn,$command[SELECT]);
}
print $data[Text];
}
function _value_of() {
}
function stylesheet() {
}
function _stylesheet() {
}
function template($command) {
echo join(" ",$command)."<br>";
}
function _template() {
}
function apply_templates($command) {
echo join(" ",$command)."<br>";
}
function _apply_templates() {
}
function xsl_eval() {
}
function _xsl_eval() {
}
}

/**** 附錄 ****
數據元素節點
Array
(
[Name] // 節點名
[Text]
[Attribute]
[Namespace]
[Comment]
[ProcessingInstruction]
[Element] => Array()
)
*************/
?>

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        国产欧美日韩三级| 国产福利视频一区二区三区| ...av二区三区久久精品| 波多野结衣视频一区| 亚洲综合色自拍一区| 欧美激情中文不卡| 日韩欧美视频一区| 色综合久久中文综合久久97| 午夜精品视频一区| 91精品国产色综合久久ai换脸| 亚洲国产综合在线| 国产美女视频一区| 国产网站一区二区| 欧美日韩中文另类| 欧美精品一区二区三区在线播放| 蜜臀99久久精品久久久久久软件| 欧美一激情一区二区三区| 韩国女主播成人在线| 久久久亚洲综合| 成人黄动漫网站免费app| 亚洲成人在线观看视频| 欧美一区二区精品| 91色在线porny| 水野朝阳av一区二区三区| 亚洲愉拍自拍另类高清精品| 欧美三级视频在线观看| 成人成人成人在线视频| 国产乱色国产精品免费视频| 国产伦精一区二区三区| 亚洲图片一区二区| 日本va欧美va精品| 韩国v欧美v日本v亚洲v| 国产精选一区二区三区| 成人一区二区视频| 91福利国产精品| 日韩三级中文字幕| 亚洲欧美在线观看| 青青草原综合久久大伊人精品优势| 石原莉奈在线亚洲三区| 欧美在线高清视频| 精品国产露脸精彩对白| 欧美色成人综合| 粉嫩嫩av羞羞动漫久久久 | 亚洲一区视频在线| 在线电影欧美成精品| 美女尤物国产一区| 中文字幕一区在线观看视频| 在线精品观看国产| 日韩精品电影在线| 欧美日韩欧美一区二区| 精品无码三级在线观看视频| 日韩电影在线观看网站| 欧美不卡一区二区三区四区| 极品尤物av久久免费看| 国产无人区一区二区三区| 99久精品国产| 久久av资源网| 亚洲情趣在线观看| 亚洲人成精品久久久久| 蜜臀精品一区二区三区在线观看| 日本一区二区三区视频视频| 欧美区视频在线观看| 精品中文字幕一区二区小辣椒| 91在线精品秘密一区二区| 欧美曰成人黄网| 欧美精品一区二区三区在线播放 | 美腿丝袜亚洲综合| 精品一区二区三区欧美| 日韩一区二区中文字幕| 欧美另类videos死尸| 欧美人牲a欧美精品| 国产91精品在线观看| 日本vs亚洲vs韩国一区三区二区| 亚洲欧美精品午睡沙发| 国产欧美精品区一区二区三区| 制服丝袜亚洲色图| 成人污污视频在线观看| 伦理电影国产精品| 亚洲精品国产一区二区精华液 | 国产精品情趣视频| 色诱亚洲精品久久久久久| 精品一区在线看| 亚洲午夜激情网站| 亚洲成人中文在线| 免费观看91视频大全| 视频一区视频二区在线观看| 青青草原综合久久大伊人精品优势| 亚洲bdsm女犯bdsm网站| 亚洲日本va在线观看| 亚洲123区在线观看| 精品一二线国产| 色哟哟一区二区三区| 欧美午夜电影一区| 日韩小视频在线观看专区| 精品噜噜噜噜久久久久久久久试看| 久久综合狠狠综合| 国产欧美日本一区二区三区| 日韩视频免费观看高清完整版在线观看 | 亚洲精品国产成人久久av盗摄| 色婷婷国产精品| 欧美丰满美乳xxx高潮www| 免费人成精品欧美精品| 亚洲自拍偷拍av| 91日韩一区二区三区| 99久久国产综合精品麻豆| 99精品久久久久久| 欧美一区二区三区精品| 精品毛片乱码1区2区3区| 久久久www成人免费毛片麻豆| 久久久电影一区二区三区| 93久久精品日日躁夜夜躁欧美| 色哟哟国产精品免费观看| 日韩视频中午一区| 夜夜精品浪潮av一区二区三区| 欧美三级中文字幕在线观看| 91亚洲精品久久久蜜桃网站 | 国产一区二区三区免费播放| 国产成人综合网| 欧美疯狂性受xxxxx喷水图片| 亚洲欧美国产77777| 久久精品国产**网站演员| 91视视频在线直接观看在线看网页在线看| 精品三级在线观看| 国产乱码字幕精品高清av| 欧美不卡在线视频| 精品一区二区三区在线播放| 欧美亚洲日本国产| 视频精品一区二区| 欧美视频一区二区三区| 国产福利一区二区| 自拍视频在线观看一区二区| 中文字幕亚洲成人| 在线精品亚洲一区二区不卡| 亚洲日本在线天堂| 久久综合久久鬼色中文字| 亚洲综合在线视频| 亚洲成人中文在线| 5566中文字幕一区二区电影| 午夜电影一区二区| 午夜电影网亚洲视频| 97久久精品人人做人人爽| 天天综合色天天综合色h| 亚洲一区二区影院| 成人久久久精品乱码一区二区三区| 久久伊99综合婷婷久久伊| 性久久久久久久| 91福利社在线观看| 亚洲日本电影在线| 成人开心网精品视频| 国产欧美日韩精品a在线观看| 免费观看一级特黄欧美大片| 99精品热视频| 国产精品12区| 精品一区二区三区久久| 国产精品―色哟哟| 精品国产一区二区三区久久久蜜月| 97超碰欧美中文字幕| 国产欧美中文在线| 欧美一区二区三区电影| 91啪九色porn原创视频在线观看| 久久超碰97人人做人人爱| 国产精品久久久久久久蜜臀| 精品国产污网站| 国产精品久久久久久久久图文区 | 粉嫩蜜臀av国产精品网站| 亚洲专区一二三| 欧美高清一级片在线观看| 久久久久99精品一区| 欧美国产精品中文字幕| 久久精品夜色噜噜亚洲aⅴ| 欧美无砖专区一中文字| 91麻豆精品久久久久蜜臀| 欧美日韩高清一区二区不卡| 色综合久久88色综合天天| 久久九九全国免费| 精品动漫一区二区三区在线观看| 久久精品欧美日韩| 欧美综合亚洲图片综合区| 国产亚洲欧美日韩在线一区| 欧美精选一区二区| 久久se精品一区精品二区| 日本不卡视频在线| 一区二区视频在线看| 国内精品久久久久影院色| 国产精品久久久一本精品| 青青草原综合久久大伊人精品| 国产亚洲综合性久久久影院| 成人深夜福利app| 亚洲免费伊人电影| 欧美一区二区在线视频| 国产在线精品一区二区不卡了| 国产欧美日韩卡一| 欧洲亚洲国产日韩| 看片网站欧美日韩| 在线观看欧美日本| 国产一区高清在线| ㊣最新国产の精品bt伙计久久| 色综合网站在线| 日本一区二区三区视频视频| 一区二区三区欧美|