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所示。

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


图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所示。

图5.30 分页报表打印的流程图
2.实施过程
实例位置:光盘\mr\5\5.4\5.4.2
使用JavaScript脚本语言可以操纵XML文档中的数据,并可以将获取到的数据进行分页处理。在ASP页面中,应用CSS样式可以定义XML数据的显示格式。下面以校园管理系统的档案管理模块为例,介绍应用JavaScript脚本语言将读取到的XML数据进行分页显示,并对显示在页面中XML数据报表进行打印。运行效果如图5.31所示。


图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所示。

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


图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样式表。






