博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用XSL和ASP在线编辑XML文档
阅读量:4970 次
发布时间:2019-06-12

本文共 5477 字,大约阅读时间需要 18 分钟。

本文通过一个详细的例子,来阐述了在线编辑XML文档数据的方法。由于Netscape对XML的支持比较弱,因此,要实现跨平台的数据交换,数据的处理必须在服务器端进行。要编辑XML文档,首先要做的事情就是怎样把这些数据提取并显示给访问者,XSL为我们显示XML文件提供了一个很好的解决方案。下面的例子就是利用XSL样式单把XML文档显示出来,供用户进行编辑,然后再把编辑后的数据提交到服务器,在服务器端进行数据的更新。这里采用ASP(Active Server Pages)来完成我们的任务。
首先,载入我们要进行编辑的XML文档,利用微软的文档对象模型(Microsoft XMLDOM Object)和XSL,XML文档就可以在服务器端转换成可以在客户端显示的HTML文件内容。下面先看看我们使用的XML和XSL文件是什么样子的。
XML文件:UserData.xml
None.gif
<?
xml version="1.0" encoding="gb2312"
?>
None.gif
<!--
 edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden) 
-->
None.gif
<
UserInfo
>
None.gif    
<
Field 
ID
="Name"
 TabOrder
="1"
>
None.gif        
<
FieldValue
>
Dicky
</
FieldValue
>
None.gif    
</
Field
>
None.gif    
<
Field 
ID
="Sex"
 TabOrder
="2"
>
None.gif        
<
FieldValue
>
Male
</
FieldValue
>
None.gif    
</
Field
>
None.gif    
<
Field 
ID
="UnitName"
 TabOrder
="3"
>
None.gif        
<
FieldValue
>
ShangHai Ateam Company
</
FieldValue
>
None.gif    
</
Field
>
None.gif    
<
Field 
ID
="Address"
 TabOrder
="4"
>
None.gif        
<
FieldValue
>
ShangHai,ZhongShan West Road 1800#,Room 26A
</
FieldValue
>
None.gif    
</
Field
>
None.gif    
<
Field 
ID
="Tel"
 TabOrder
="5"
>
None.gif        
<
FieldValue
>
13800138000
</
FieldValue
>
None.gif    
</
Field
>
None.gif    
<
Field 
ID
="EMail"
 TabOrder
="6"
>
None.gif        
<
FieldValue
>
AppleBBS@GMail.Com
</
FieldValue
>
None.gif    
</
Field
>
None.gif
</
UserInfo
>

XSL文件:UserData.xsl

None.gif
<?
xml version="1.0" encoding="gb2312"
?>
None.gif
<!--
 edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden) 
-->
None.gif
<
xsl:stylesheet 
xmlns:xsl
="http://www.w3.org/TR/WD-xsl"
>
None.gif    
<
xsl:template 
match
="/"
>
None.gif        
<
html
>
None.gif            
<
meta 
http-equiv
="Content-Type"
 content
="text/html; charset=gb2312"
/>
None.gif            
<
body
>
None.gif                
<
form 
method
="post"
 action
="EditUserData.asp"
>
None.gif                    
<
h1
>
Edit UserInfo:
</
h1
>
None.gif                    
<
table 
border
="1"
 cellpadding
="2"
>
None.gif                        
<
xsl:for-each 
select
="UserInfo/Field"
>
None.gif                            
<
tr
>
None.gif                                
<
td
>
None.gif                                    
<
xsl:value-of 
select
="@ID"
/>
None.gif                                
</
td
>
None.gif                                
<
td
>
None.gif                                    
<
input 
type
="text"
>
None.gif                                        
<
xsl:attribute 
name
="ID"
><
xsl:value-of 
select
="@ID"
/></
xsl:attribute
>
None.gif                                        
<
xsl:attribute 
name
="Name"
><
xsl:value-of 
select
="@ID"
/></
xsl:attribute
>
None.gif                                        
<
xsl:attribute 
name
="Value"
><
xsl:value-of 
select
="FieldValue"
/></
xsl:attribute
>
None.gif                                    
</
input
>
None.gif                                
</
td
>
None.gif                            
</
tr
>
None.gif                        
</
xsl:for-each
>
None.gif                    
</
table
>
None.gif                    
<
br
/>
None.gif                    
<
input 
type
="submit"
 id
="btnSubmit"
 name
="btnSubmit"
 value
="Edit"
/>
None.gif                
</
form
>
None.gif            
</
body
>
None.gif        
</
html
>
None.gif    
</
xsl:template
>
None.gif
</
xsl:stylesheet
>

XSL文件使用了XSL:for-each元素的来遍历整个XML文件,XML文件里每个“field”元素的“id”属性和HTML表单的文本输入框的“id”和“name”相对应。这样,HTML表单的文本输入框就显示出了XML文件的元素值。此文件负责XML文档在服务器端的转换,以便能在各种浏览器上显示。
下面是关键的程序,它实现打开和更新XML文档的功能,并根据表单的提交与否,来决定是否进行更新。它包含了两个函数,loadXMLFile负责载入和转换要显示的XML文件;updateXML函数负责更新XML文件。

EditUserData.asp程序如下:

None.gif
<
None.gif
'
----------------------------------------------------------- 
None.gif'
定义函数 LoadXMLFile(),接收二个参数: 
None.gif'
strXMLFile - XML 文件的路径和文件名字 
None.gif'
strXSLFilee - XSL 文件的路径和文件名字 
None.gif'
-----------------------------------------------------------  
None.gif
Function
 LoadXMLFile(strXMLFile, strXSLFile) 
None.gif    
'
Declare local variables 
None.gif
    
Dim
 objXML 
None.gif    
Dim
 objXSL 
None.gif    
'
实例化 XMLDOM 对象,以便载入 XML 文件。 
None.gif
    
Set
 objXML 
=
 Server.
CreateObject
(
"
Microsoft.XMLDOM
"
None.gif    
'
关掉文件异步载入模式。 
None.gif
    objXML.Async 
=
 
False
 
None.gif    
'
载入 XML 文件! 
None.gif
    objXML.Load(strXMLFile) 
None.gif    
'
实例化 XMLDOM 对象,以便载入 XSL 文件。 
None.gif
    
Set
 objXSL 
=
 Server.
CreateObject
(
"
Microsoft.XMLDOM
"
None.gif    
'
关掉文件异步载入模式。 
None.gif
    objXSL.Async 
=
 
False
 
None.gif    
'
载入 XSL 文件! 
None.gif
    objXSL.Load(strXSLFile) 
None.gif    
'
利用 XMLDOM 的 transformNode 方法,把 XSL 样式表应用到 XML 文档,然后输出到客户端。 
None.gif
    Response.Write(objXML.TransFormNode(objXSL)) 
None.gif
End Function
 
None.gif
'
------------------------------------------------------------------ 
None.gif'
函数 updateXML() 接收一个参数:strXMLFile - XML 文件的路径和文件名。 
None.gif'
------------------------------------------------------------------ 
None.gif
Function
 UpdateXML(strXMLFile) 
None.gif    
'
声明局部变量。 
None.gif
    
Dim
 objDom 
None.gif    
Dim
 objRoot 
None.gif    
Dim
 objField 
None.gif    
Dim
 x 
None.gif    
'
实例化 XMLDOM 对象。 
None.gif
    
Set
 objDOM 
=
 Server.
CreateObject
(
"
Microsoft.XMLDOM
"
None.gif    
'
关掉文件异步载入模式。 
None.gif
    objDom.Async 
=
 
False
 
None.gif    
'
载入 XML 文件。 
None.gif
    objDom.Load strXMLFile 
None.gif    
'
设定根元素。 
None.gif
    
Set
 objRoot 
=
 objDom.DocumentElement 
None.gif    
'
遍历 FORM 集合,并把提交的数据写入 XML 文件。 
None.gif
    
For
 x 
=
 
1
 
To
 Request.Form.Count 
None.gif    
'
检查提交的数据是否包含按钮。如果是,忽略此数据。 
None.gif
        
If
 
Instr
(
1
,Request.Form.Key(x),
"
btn
"
=
 
0
 
Then
 
None.gif        
'
按照 XSL 查询模式,建立 objField 变量,把表单的元素对应到 XML 文档里的相应元素[field_value]。 
None.gif
            
Set
 objField 
=
 objRoot.SelectSingleNode(
"
Field[@ID='
"
 
&
 Request.Form.Key(x) 
&
 
"
']/FieldValue
"
None.gif            
'
把表单提交的数据和 XML 文档里的节点值对应起来。 
None.gif
            objField.Text 
=
 Request.Form(x) 
None.gif        
End
 
If
 
None.gif    
Next
 
None.gif    
'
保存编辑过的 XML 文件。 
None.gif
    objDom.Save strXMLFile 
None.gif    
'
释放所有对对象的引用。 
None.gif
    
Set
 objDom 
=
 
Nothing
 
None.gif    
Set
 objRoot 
=
 
Nothing
 
None.gif    
Set
 objField 
=
 
Nothing
 
None.gif    
'
调用 LoadXMLFile 函数,把新编辑后的 XML 文件用 UpdatedUserData.xsl 样式单显示到客户端。 
None.gif
    LoadXMLFile strXMLFile,Server.MapPath(
"
UpdatedUserData.xsl
"
None.gif
End Function
 
None.gif
'
检查表单是否成功提交,如提交,更新 XML 文件;否则,转到编辑状态。 
None.gif
If
 Request.Form(
"
btnSubmit
"
=
 
""
 
Then
 
None.gif    LoadXMLFile Server.MapPath(
"
UserData.xml
"
),Server.MapPath(
"
UserData.xsl
"
None.gif
Else
 
None.gif    UpdateXML Server.MapPath(
"
UserData.xml
"
None.gif
End
 
If
None.gif%
>
当表单提交成功后,我们用UpdatedUserData.xsl来显示我们刚刚编辑的数据。
UpdatedUserData.xsl如下:
None.gif
<?
xml version="1.0" encoding="gb2312"
?>
None.gif
<!--
 edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden) 
-->
None.gif
<
xsl:stylesheet 
xmlns:xsl
="http://www.w3.org/TR/WD-xsl"
>
None.gif    
<
xsl:template 
match
="/"
>
None.gif        
<
html
>
None.gif            
<
meta 
http-equiv
="Content-Type"
 content
="text/html; charset=gb2312"
/>
None.gif            
<
body
>
None.gif                
<
h1
>
Updated UserInfo:
</
h1
>
None.gif                
<
table 
border
="1"
 cellpadding
="2"
>
None.gif                    
<
xsl:for-each 
select
="UserInfo/Field"
>
None.gif                        
<
tr
>
None.gif                            
<
td
>
None.gif                                
<
xsl:value-of 
select
="@ID"
/>
None.gif                            
</
td
>
None.gif                            
<
td
>
None.gif                                
<
xsl:value-of 
select
="FieldValue"
/>
None.gif                            
</
td
>
None.gif                        
</
tr
>
None.gif                    
</
xsl:for-each
>
None.gif                
</
table
>
None.gif                
<
form
>
None.gif                    
<
input 
type
="button"
 value
="Go Back"
 onclick
="history.go(-1)"
/>
None.gif                
</
form
>
None.gif            
</
body
>
None.gif        
</
html
>
None.gif    
</
xsl:template
>
None.gif
</
xsl:stylesheet
>
以上只是XML跨平台应用的一个简单的例子,结合具体的需求,我们可以编写功能更强大的程序来完成我们更负杂的工作。所有程序在Windows 2003 En+IIS 6.0+IE6.0+MSXML3.Dll环境下调试通过。

转载于:https://www.cnblogs.com/Dicky/archive/2005/03/24/125173.html

你可能感兴趣的文章
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
JavaWeb之JSON
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>