首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

5.4  XML技术报表打印方案

随着Internet的迅速发展和广泛普及,XML的出现体现出了它的适用性和重要性。XML是由W3C定义的一种标记语言,由于XML是没有版权限制的,这样用户可以建立属于自己的一套软件而无须支付任何费用。利用ASP结合XML技术,可以实现对XML数据的报表打印操作。其原理是:通过XML强大的自定义功能,用户可以很方便地自定义出所需要的数据结构,然后在服务器端进行动态编码,通过Web服务器将数据发送到客户端,在客户端进行格式解析后,再根据服务器端定义的打印格式,从客户端直接控制打印机打印出所需要的报表。

5.4.1  打印XML数据报表

XML的出现推动了Web的发展。在XML文档中用户可以自己定义标记,从而明确表达出数据之间的结构关系。在一些数据量不是很大的情况下,可以使用XML文档作为存储数据的容器,因为相对于访问数据库而言,访问XML文档的速度比较快。在ASP应用程序中,可以访问XML文档中的数据,从而将其显示到页面中进行打印操作。

1.方案分析

XML具有灵活的语法和扩展性,极大地强化了保存数据和处理数据的能力。

XML文档中的标记是由用户自己定义的,浏览器是不能识别的,这就使得XML文档的数据和显示格式是分离的。在ASP中,通过DOM技术可以访问XML文档中的数据,然后将其内容显示到ASP页面中,再应用打印技术打印此XML数据报表。

打印XML数据报表的流程图,如图5.28所示。

图\方案bmp\打印XML数据报表.bmp

图5.28  打印XML数据报表流程图

2.实施过程

01  实例位置光盘\mr\5\5.4\5.4.1

XML在处理数据的方面应用很广泛,在ASP中通过使用Microsoft XML类库,可以访问和操控XML文档中的数据,从而实现对数据的有效操作。下面以网上企业办公自动化管理系统为例,介绍如何将存储在XML文档中的员工工资信息读取到ASP页面并进行打印操作。运行效果如图5.29所示。

线形标注 2: 打印从XML文档中读取的数据报表图\方案bmp\打印XML数据报表2.bmp

图5.29  打印XML数据报表

在运行本例程之前,需要建立有效的XML文档,代码如下:

例程5-16  代码位置:光盘\mr\5\5.4\5.4.1\payfor.xml

<?xml version="1.0" encoding="gb2312"?>

<Records>

   <Record>

       <num>001</num>

       <Name>杨丽丽</Name>

       <age>31</age>

       <department>研发部</department>

       <payfor>5500</payfor>

       <other>1000</other>

   </Record>

   <Record>

       <num>002</num>

       <Name>刘圆圆</Name>

       <age>28</age>

       <department>销售部</department>

       <payfor>4600</payfor>

       <other>592</other>

   </Record>

   <Record>

       <num>003</num>

       <Name>李方方</Name>

       <age>25</age>

       <department>广告部</department>

       <payfor>4050</payfor>

       <other>976</other>

   </Record>

   <Record>

       <num>004</num>

       <Name>李明明</Name>

       <age>29</age>

       <department>采购部</department>

       <payfor>4650</payfor>

       <other>1050</other>

   </Record>

</Records>

在员工工资查看程序处理页面中,首先创建Document对象实例,然后设置该对象的async属性值为false(即不允许异步下载),并调用Document对象的Load方法加载指定的XML文档,再调用Document对象的getElementsByTagName方法以及childNodes属性读取XML文档中的数据。代码如下:

例程5-17  代码位置:光盘\mr\5\5.4\5.4.1\index.asp

<%

   Set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")

   Set xml_Record=Server.CreateObject("Microsoft.XMLDOM")

   Set xml_child=Server.CreateObject("Microsoft.XMLDOM")

   xmlDoc.async=False

   xmlDoc.Load(Server.MapPath("payfor.xml"))

   If xmlDoc.parseError.errorCode <> 0 Then

     Response.Write("<tr><td colspan='6'>出现异常错误!</td></tr>")     

   Else

调用Document对象的getElementsByTagName方法返回指定名称的元素集合,使用集合的length属性获取到元素的总数,再应用for…to循环语句读取元素中各节点的内容。

     Set xml_Record=xmlDoc.getElementsByTagName("Record")

     record_num=xml_Record.length

     For i=0 to (record_num-1)

     Set xml_child=xml_Record.item(i)

  %>

<tr>

  <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(0).text%></td>

  <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(1).text%></td>

  <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(2).text%></td>

  <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(3).text%></td>

  <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(4).text%></td>

  <td align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(5).text%></td>

</tr>

<%Next

  End If

%>

将XML文档中的数据信息显示到ASP页面后,就可以应用WebBrowse组件对页面中的报表信息进行打印操作了。代码如下:

例程5-18  代码位置:光盘\mr\5\5.4\5.4.1\index.asp

<style type="text/css">

@media print{

.Noprint{display:none /*应用该样式的对象在实际打印时将不可见*/

}

</style>

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"></object>

<a href="#" onclick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">页面属性</a> <a href="#" onclick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印预览</a> <a href="#" onclick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a>

   注意:在打印时,通过页面设置可以设置打印时的边距。

3.补充说明

在实际应用中,有时需要将数据库中的数据导出到XML文档中,再进行下一步的操作(如打印XML数据库报表、查询XML数据等)。

通过创建XML文档对象,并设置对象的相关属性和调用相关方法,可以实现将数据库中的数据写入到指定XML文档的功能,代码如下:

<%

If Not Isempty(Request("sure")) Then

'将数据库中的数据写入到XML文档中

Set rs = Server.CreateObject("ADODB.RecordSet")

sqlstr = "SELECT * FROM tb_user"   

rs.Open sqlstr,conn,1,1

If rs.Eof Then

  Response.Write("<script language='javascript'>alert('数据库中暂无记录,请添加记录后再尝试运行本程序!');window.location.href='index.asp';</script>")

  Response.End()

Else       

  Dim objXMLDOM, objRootNode, objNode

  Set objXMLDOM = Server.CreateObject("MSXML2.DOMDocument") '创建XML文档对象

  Set objRootNode = objXMLDOM.createElement("xml") '创建根节点  

  objXMLDOM.documentElement = objRootNode

  Do While Not rs.Eof      

       Set objRowNode = objXMLDOM.createElement("row") '创建父节点

       Set objNode = objXMLDOM.createElement("UserName") '创建子节点

       objNode.text = rs("UserName")

       objRowNode.appendChild(objNode)

       Set objNode = objXMLDOM.createElement("UserPassword") '创建子节点

       objNode.text = rs("Upwd")           

       objRowNode.appendChild(objNode)                 

       Set objNode = objXMLDOM.createElement("UserTel")     '创建子节点      

       objNode.text = rs("Utel")           

       objRowNode.appendChild(objNode)                 

       objRootNode.appendChild(objRowNode)       

       rs.MoveNext

  loop                

objXMLDOM.Save Server.MapPath("MyXMLDoc.xml")

Response.Write("<script language='javascript'>alert('将数据库中的数据成功写入到XML文档中!');window.location.href='index.asp';</script>")

  Set objNode = Nothing            

  Set objRowNode = Nothing        

  Set objRootNode = Nothing    

End If   

rs.Close   

Set rs = Nothing

End If

%>

5.4.2  分页报表打印

在一般情况下,显示数据的页面都会提供分页程序,以方便用户查看数据信息。在ASP应用程序中,可以使用JavaScript脚本语言来操作XML文档中存储的数据,并将信息进行分页显示。

1.方案分析

在使用XML文档作为存储数据的容器时,根据实际情况,对显示的数据可以进行分页控制。应用JavaScript脚本语言可以创建XML的Document对象,并使用Document对象的相关属性和方法,读取XML文档中各节点包含的数据,同时还可以对数据进行分页控制,然后在ASP页面中通过CSS样式来规范读取到的XML数据的显示格式,最后应用打印技术按照显示的分页效果打印XML数据报表。

分页报表打印的流程图,如图5.30所示。

图\方案bmp\分页报表打印.bmp

图5.30  分页报表打印的流程图

2.实施过程

01  实例位置光盘\mr\5\5.4\5.4.2

使用JavaScript脚本语言可以操纵XML文档中的数据,并可以将获取到的数据进行分页处理。在ASP页面中,应用CSS样式可以定义XML数据的显示格式。下面以校园管理系统的档案管理模块为例,介绍应用JavaScript脚本语言将读取到的XML数据进行分页显示,并对显示在页面中XML数据报表进行打印。运行效果如图5.31所示。

线形标注 2: 打印从XML文档中读取到的分页报表数据图\方案bmp\分页报表打印2.bmp

图5.31  分页报表打印

在运行本例程之前,需要建立有效的XML文档,代码如下:

例程5-19 代码位置:光盘\mr\5\5.4\5.4.2\resume.xml

<?xml version="1.0" encoding="gb2312"?>

<Persons>

   <Person>

       <Name>张三</Name>

       <Sex>男</Sex>

       <Grand>本科</Grand>

       <Tel>139565580</Tel>

       <Email>1@1.com</Email>

       <Like>计算机、英语</Like>

   </Person>

   <Person>

       <Name>李四</Name>

       <Sex>男</Sex>

       <Grand>本科</Grand>

       <Tel>133884580</Tel>

       <Email>2@1.com</Email>

       <Like>计算机、运动</Like>

   </Person>

   <Person>

       <Name>王元元</Name>

       <Sex>女</Sex>

       <Grand>专科</Grand>

       <Tel>135899680</Tel>

       <Email>3@1.com</Email>

       <Like>日语、英语</Like>

   </Person>

   <Person>

       <Name>赵明明</Name>

       <Sex>女</Sex>

       <Grand>本科</Grand>

       <Tel>139258880</Tel>

       <Email>4@1.com</Email>

       <Like>绘画、英语</Like>

   </Person>

</Persons>

在档案信息列表查看页面中,用户可以通过单击“前一页”或“后一页”超链接,进行分页查看信息的操作,也可以通过选择下拉列表框中的页码来分页查看数据信息。在此页面中,提供了“直接打印”、“页面属性”、“打印预览”和“打印”4个关于打印技术的超链接,用户可以根据实际需要进行相应的操作。

在程序处理页面编写的JavaScript脚本中,首先创建XML的Document对象实例,调用对象的load方法加载指定的XML文档;然后获取XML文档中指定元素的个数,以及元素中包含节点的数目,根据所设置的初始值,计算显示的页码总数;再定义执行翻页操作的相关函数,并在定义的显示XML文档内容的函数中包含显示分页状态的函数;最后调用显示XML文档内容的函数,实现分页显示XML数据报表的功能。代码如下:

例程5-20 代码位置:光盘\mr\5\5.4\5.4.2\index.asp

<script language="javascript">

var pagenum=2; //每页显示的记录数

var page=0; 

var BodyHTML="";

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

var mode="Person";

创建Document对象实例后,加载指定的XML文档。

xmlDoc.async=false;

xmlDoc.load("resume.xml");

header="<table align='center' width='500' cellspaceing='1' cellpadding='2' border='1' bgcolor='#FFFFEE'><caption>职工档案登记表</caption><tr align='center' class='title' bgcolor='#C1E6DB'><td>姓名</td><td>性别</td><td>学历</td><td>电话</td><td>Email</td><td>爱好</td></tr>";

获取XML文档中的记录条数,以及记录包含的字段数,并计算显示的总页码数。

recordNum=xmlDoc.getElementsByTagName(mode).length;

column=xmlDoc.getElementsByTagName(mode).item(0).childNodes;

colNum=column.length;

//计算总页数

pagesNumber=Math.ceil(recordNum/pagenum)-1;

自定义显示“前一页”超链接的函数。

function Up_Page(page)

{

thePage="<font class='input'>前一页</font>"

if(page+1 > 1) thePage="<a class='input' href='#' onclick='JavaScript:return UpPageGo()'>前一页</a>";

return thePage;

}

function UpPageGo()

{

if(page > 0) page--;

showContent();

BodyHTML="";

}

自定义显示“后一页”超链接的函数。

function Next_Page(page)

{

thePage="<font class='input'>后一页</font>"

if(page < pagesNumber) thePage="<a class='input' href='#' onclick='JavaScript:return NextPageGo()'>后一页</a>";

return thePage;

}

function NextPageGo()

{

if(page < pagesNumber) page++;

showContent();

BodyTex="";

}

自定义显示当前页码的函数。

function currentPage()//显示当前页码

{

var str;

str="<font class='input'>当前是第"+(page+1)+"页</font>";

return str;

}

自定义显示总页码的函数。

function totalPage()//显示总页码

{

var str;

str="<font class='input'>共有"+(pagesNumber+1)+"页</font>";

return str;

}

自定义显示“分页状态条”的函数。

function pageBar(page)//显示分页状态条

{

var str;

str="<br><center class='Noprint'>"+Up_Page(page)+" "+Next_Page(page)+" "+currentPage()+" "+totalPage()+selectPage()+"</center>";

return str;

}

自定义自动转换显示页的函数。

function changePage(tpage)

{

page=tpage;

if(page >= 0) page--;

if(page < pagesNumber) page++;

showContent();

BodyHTML="";

}

自定义具体显示页码功能的下拉列表框函数。

function selectPage()

{

var sp;

sp="<select name='sel_page' onChange='javascript:changePage(this.options[this.selectedIndex].value)'>";

sp=sp+"<option value=''></option>";

for(t=0;t<=pagesNumber;t++)

{

  sp=sp+"<option value='"+t+"'>"+(t+1)+"</option>";

}

sp=sp+"</select>";

return sp;

}

自定义显示XML文档内容的函数。

function showContent()//将XML中的数据显示到页面中

{

if(!page) page=0;

n=page*pagenum;

endNum=(page+1)*pagenum;

if(endNum > recordNum) endNum=recordNum;

BodyHTML=header+BodyHTML;

for(;n<endNum;n++)

{

  kn=n+1;

  BodyHTML=BodyHTML+"<tr>";

  for(mNum=0;mNum<=colNum-1;mNum++)

  {

    mName=column.item(mNum).tagName;

   BodyHTML=BodyHTML+("<td>"+xmlDoc.getElementsByTagName(mName).item(n).text+"</td>");

  }

  BodyHTML=BodyHTML+"</tr>";

}

document.all.showXML.innerHTML=BodyHTML+"</table>"+pageBar(page);

BodyHTML="";

}

调用自定义的showContent()函数,将XML文档中的数据信息显示到页面中指定的DIV标记中。

if(recordNum==0)

{

  document.Write("没有可以显示的数据!");

}

else

{

  showContent();

}

</script>

将XML文档中的内容显示到页面后,可以调用WebBrowser组件对报表进行打印,代码如下:

例程5-21 代码位置:光盘\mr\5\5.4\5.4.2\index.asp

<div id="showXML"></div>

<p class="Noprint">

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"></object>

<a href="#" onClick="document.all.WebBrowser.Execwb(6,6)">直接打印</a> <a href="#" onClick="document.all.WebBrowser.Execwb(8,1)">页面属性</a> <a href="#" onClick="document.all.WebBrowser.Execwb(7,1)">打印预览</a> <a href="#" onClick="document.all.WebBrowser.Execwb(6,1)">打印</a>

</p>

在页面中应用的CSS样式定义如下:

例程5-22 代码位置:光盘\mr\5\5.4\5.4.2\Include\css.css

body,td{font-size:9pt}

A:link{color:#0000FF; text-decoration:none;}

A:visited{color:#0000FF; text-decoration:none;}

A:active{color:#3333ff; text-decoration:none;}

A:hover{color:#FF0000; text-decoration:none;}

td{font-size:9pt; line-height:150%}

.title{font-size:10.8pt; font-weight:bold}

.alert{font-size:9pt; color:#990000; font-weight:bold}

.input{font-size:9pt}

3.补充说明

除了使用JavaScript脚本语言对XML文档中的数据进行分页操作,在ASP中也可以将XML数据分页显示到网页中。具体实现步骤如下:

(1)创建一个XML的FreeThreadedXMLDOM对象,并加载指定的XML文档,然后选取相关节点,代码如下:

<%

Set newXML=Server.CreateObject("Microsoft.FreeThreadedXMLDOM")

newXML.load(server. mappath("content.xml"))

Set newobj=newXML.documentElement.selectSingleNode("newxml")

%>

(2)通过以下代码实现对XML数据进行分页显示,代码如下:

<%

PageSize =5

'设置每页显示5条留言信息

newNum =newobj.childNodes.length-1

PageN=newNum\PageSize+1

'算出总页数

PNo=request.querystring("PageNo")

if PNo="" then

'确定每一页显示最新的留言

PNo=PageN

end if

Ends=PNo*PageSize-1

'获得起始节点

Strs=(PNo-1)*PageSize

'获得结束节点

if Strs<0 then

Strs=0

end if

if Ends>newNum then

Strs=Strs-(Ends-newNum)

Ends=newNum

end if

if Strs<0 then

Strs=0

end if

while Strs<=Ends

'从结束节点到起始节点之间读取节点数据

title=newobj.childNodes.item(Strs).childNodes.item(0).text

content = newobj.childNodes.item(Strs).childNodes.item(1).text

'取得留言内容

content = replace(content,chr(13),"<br>")

'应用replace函数替代回车符

content = replace(content,chr(32)," ")

'应用replace函数替代空格符

%>

<tr>

<td ><div align="center" class="STYLE2"><%=title%></div></td>

<td class="STYLE2"><div align="center"><%=content%></div></td>

</tr>

<%

Strs=Strs+1

wend

set newXML=nothing

%>  

</table><br>共有<<%=PageN%>>页

<%

'分页

if cint(PNo)<>1 then

response.write "<a href='index.asp?PageNo="&(PNo-1)&"'>上一页</a> "

end if

if cint(PNo)<>PageN then       

response.write "<a href='index.asp?PageNo="&(PNo+1)&"'>下一页</a>"

end if

%>

5.4.3  XSL浏览报表打印

XSL语言可以用于转换XML文档,也可以格式化XML文档。应用XSL语言可以定义XML文档的显示格式,即将XML文档转换成能被浏览器识别的HTML文件;应用XSL语言还可以向输出文件中添加新的元素、重新排列数据以及决定哪些元素显示哪些元素不显示等。

根据实际需要,可以通过XSL格式化XML文档,并使数据信息以一定的格式显示到ASP页面中,然后对报表数据执行打印操作。

1.方案分析

使用XSL语言可以灵活、快速地定义出XML文档的显示格式,使格式化后的XML文档数据以清晰的结构显示在用户面前。在ASP程序中,可以应用XSL浏览XML数据报表,并进行打印操作。

首先,用户需要建立有效的.xml文件和.xsl文件,然后在ASP程序中创建XML的DOMDocument对象实例,应用该对象的相关方法加载建立好的两个文件,并应用.xsl文件来格式化.xml文件,这样XML文档中的数据就能够以.xsl文件规定的格式进行显示了,再应用相关的打印技术打印显示在ASP页面中的数据报表。

XSL浏览报表打印的流程图,如图5.32所示。

图\方案bmp\XML浏览报表打印.bmp

图5.32  XSL浏览报表打印流程图

2.实施过程

01  实例位置光盘\mr\5\5.4\5.4.3

在实际应用中,不仅可以通过CSS样式来定义XML文档的显示格式,还可以应用XSL语言来转换或格式化XML文档,使浏览器可以识别XML文档中的数据结构,从而使数据以指定的格式显示在页面中。下面以企业绩效管理系统的员工考勤模块为例,介绍如何使用XSL格式化XML文档,并将XML文档中的数据以分页的形式显示在页面中,然后打印显示的报表。运行效果如图5.33所示。

线形标注 2: 打印以XSL格式化的XML文档中的数据报表图\方案bmp\XML浏览报表打印2.bmp

图5.33  XSL浏览报表打印

在运行本例程之前,需要建立有效的XML文档,代码如下:

例程5-23  代码位置:光盘\mr\5\5.4\5.4.3\emp_work.xml

<?xml version="1.0" encoding="gb2312"?>

<Persons>

   <Person>

       <num>001</num>

       <date>2007年9月</date>

       <Name>张三</Name>

       <department>研发部</department>

       <count>10</count>

       <day>1</day>

   </Person>

   <Person>

       <num>002</num>

       <date>2007年9月</date>

       <Name>李四</Name>

       <department>销售部</department>

       <count>2</count>

       <day>0</day>

   </Person>

下面定义了两个<Person2>的标记,作为分页的标识。

   <Person2>

       <num>003</num>

       <date>2007年9月</date>

       <Name>杨林林</Name>

       <department>企划部</department>

       <count>0</count>

       <day>2</day>

   </Person2>

   <Person2>

       <num>004</num>

       <date>2007年9月</date>

       <Name>孙圆圆</Name>

       <department>广告部</department>

       <count>1</count>

       <day>0</day>

   </Person2>

</Persons>

建立了有效的XML文档后,为此XML文档建立.xsl文件,在.xsl文件中使用表格来规定数据的显示格式。代码如下:

例程5-24  代码位置:光盘\mr\5\5.4\5.4.3\emp_work.xsl

<?xml version="1.0" encoding="gb2312"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/Persons">

首先在<p>标记中建立表格,此表格的作用是使XML文档中<Person>标记内的数据显示在指定的单元格中。

<p><table align="center" width="500" cellpadding="2" cellspacing="1" border="0" bgcolor="#666600" class="table_style">

<caption align="center">员工考勤记录表</caption>

  <tr align="center" class="title" bgcolor="#e5e5e5">

    <td width="25"><xsl:text disable-output-escaping="yes"></xsl:text></td>

   <td>序号</td>

   <td>日期</td>

   <td>姓名</td>

   <td>所属部门</td>

   <td>早退迟到次数</td>

   <td>缺席天数</td>

  </tr>

  <xsl:for-each select="Person">

  <tr bgcolor="#ffffff">

    <td align="right"><xsl:value-of select="position()"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="num"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="date"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="Name"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="department"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="count"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="day"/></td>

  </tr>

  </xsl:for-each>

</table></p>

再次在<p>标记中建立表格,此表格的作用是使XML文档中<Person2>标记内的数据显示在指定的单元格中。

<p><table align="center" width="500" cellpadding="2" cellspacing="1" border="0" bgcolor="#666600" class="table_style">

  <tr align="center" class="title" bgcolor="#e5e5e5">

    <td width="25"><xsl:text disable-output-escaping="yes"></xsl:text></td>

   <td>序号</td>

   <td>日期</td>

   <td>姓名</td>

   <td>所属部门</td>

   <td>早退迟到次数</td>

   <td>缺席天数</td>

  </tr>

  <xsl:for-each select="Person2">

  <tr bgcolor="#ffffff">

    <td align="right"><xsl:value-of select="position()"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="num"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="date"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="Name"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="department"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="count"/></td>

   <td style="color:#990000" align="center"><xsl:value-of select="day"/></td>

  </tr>

  </xsl:for-each>

</table></p>

</xsl:template>

</xsl:stylesheet>

建立了有效的.xml文件和.xsl文件后,自定义一个函数,此函数的作用是创建XML的DOMDocument对象实例,应用对象的load方法分别加载.xml文件和.xsl文件,然后调用DOMDocument对象的TransformNode方法使用.xsl文件格式化.xml文件。代码如下:

例程5-25  代码位置:光盘\mr\5\5.4\5.4.3\Include\formatxml.asp

<%

Function FormatXML(XMLfile,XSLfile)

Dim objXML,objXSL

strXMLfile=Server.MapPath(XMLfile)

strXSLfile=Server.MapPath(XSLfile)

Set objXML=Server.CreateObject("MSXML2.DOMDocument")

Set objXSL=Server.CreateObject("MSXML2.DOMDocument")

objXML.async=false

If objXML.Load(strXMLfile) Then

  objXSL.async=false

  objXSL.ValidateonParse=false

  If objXSL.Load(strXSLfile) Then

    On Error Resume Next

   FormatXML=objXML.transformNode(objXSL)'很重要

   If objXSL.parseError.errorCode <> 0 Then

     Response.Write("<br><hr>")

     Response.Write("Error Code: "&objXSL.parseError.errorCode)

     Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

     Response.Write("<br>Error Line: "&objXSL.parseError.line)

     FormatXML="<span class=""alert"">格式化XML文件错误!</span>"

   End IF

  Else

     Response.Write("<br><hr>")

     Response.Write("Error Code: "&objXSL.parseError.errorCode)

     Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

     Response.Write("<br>Error Line: "&objXSL.parseError.line)

     FormatXML="<span class=""alert"">格式化XML文件错误!</span>"

  End If

Else

     Response.Write("<br><hr>")

     Response.Write("Error Code: "&objXSL.parseError.errorCode)

     Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

     Response.Write("<br>Error Line: "&objXSL.parseError.line)

     FormatXML="<span class=""alert"">格式化XML文件错误!</span>"

End If

Set objXML=Nothing

Set objXSL=Nothing

End Function

%>

做好前期准备之后,在首页面中包含Include文件夹中的formatxml.asp文件,调用自定义的FormatXML(XMLfile,XSLfile)函数显示XML文档中的数据信息,并引用WebBrowser组件打印页面中的XML数据报表。代码如下:

例程5-26  代码位置:光盘\mr\5\5.4\5.4.3\index.asp

<style media="print">

.Noprint{display:none;}

</style>

<!--#include file="Include/formatxml.asp"-->

<%=FormatXML("emp_work.xml","emp_work.xsl")%>

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0">

</object>

<p> <a href="#" onclick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">页面属性</a> <a href="#" onclick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印预览</a> <a href="#" onclick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a> </div></p>

3.补充说明

除了调用XML对象的相关方法使用.xsl文件格式化.xml文件,还可以在XML文档中直接链接指定的.xsl文件,从而实现转换XML文档格式的效果。代码如下:

XSL样式表文件xmlf.xsl。

<?xml version="1.0" encoding="gb2312"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

   <html>

   <body>

   <center>

   <table width="300" height="30" border="10" cellspacing="0" cellpadding="0">

     <tr align="center">

       <td>书名</td>

       <td>页码</td>

     </tr>

<xsl:for-each select="PUBLICATION/BOOK">

     <tr align="center" height="30">

       <td><xsl:value-of select="TITLE"/></td>

       <td><xsl:value-of select="PAGES"/></td>

     </tr>

</xsl:for-each>     

   </table>

   </center>

   </body>

   </html>

</xsl:template>

</xsl:stylesheet>

XML文件index.xml。

<?xml version="1.0" encoding="gb2312"?>

<?xml-stylesheet type="text/xsl" href="xmlf.xsl"?>

<PUBLICATION>

   <BOOK>

       <TITLE>ASP技术</TITLE>

       <PAGES>760</PAGES>

   </BOOK>

   <BOOK>

       <TITLE>SQL技术</TITLE>

       <PAGES>520</PAGES>

   </BOOK>

</PUBLICATION>

在XML文档中如果链接了多个XSL样式表,浏览器将使用第一个XSL样式表而忽略其他XSL样式表;如果同时链接一个CSS样式表文件和一个XSL样式表,浏览器将只使用XSL样式表。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论