本文通过一个详细的例子,来阐述了在线编辑XML文档数据的方法。由于Netscape对XML的支持比较弱,因此,要实现跨平台的数据交换,数据的处理必须在服务器端进行。要编辑XML文档,首先要做的事情就是怎样把这些数据提取并显示给访问者,XSL为我们显示XML文件提供了一个很好的解决方案。下面的例子就是利用XSL样式单把XML文档显示出来,供用户进行编辑,然后再把编辑后的数据提交到服务器,在服务器端进行数据的更新。这里采用ASP(Active Server Pages)来完成我们的任务。
首先,载入我们要进行编辑的XML文档,利用微软的文档对象模型(Microsoft XMLDOM Object)和XSL,XML文档就可以在服务器端转换成可以在客户端显示的HTML文件内容。下面先看看我们使用的XML和XSL文件是什么样子的。
XML文件:UserData.xml
<?
xml version="1.0" encoding="gb2312"
?>
<!--
edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden)
-->
<
UserInfo
>
<
Field
ID
="Name"
TabOrder
="1"
>
<
FieldValue
>
Dicky
</
FieldValue
>
</
Field
>
<
Field
ID
="Sex"
TabOrder
="2"
>
<
FieldValue
>
Male
</
FieldValue
>
</
Field
>
<
Field
ID
="UnitName"
TabOrder
="3"
>
<
FieldValue
>
ShangHai Ateam Company
</
FieldValue
>
</
Field
>
<
Field
ID
="Address"
TabOrder
="4"
>
<
FieldValue
>
ShangHai,ZhongShan West Road 1800#,Room 26A
</
FieldValue
>
</
Field
>
<
Field
ID
="Tel"
TabOrder
="5"
>
<
FieldValue
>
13800138000
</
FieldValue
>
</
Field
>
<
Field
ID
="EMail"
TabOrder
="6"
>
<
FieldValue
>
AppleBBS@GMail.Com
</
FieldValue
>
</
Field
>
</
UserInfo
>
<?
xml version="1.0" encoding="gb2312"
?>
<!--
edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden)
-->
<
xsl:stylesheet
xmlns:xsl
="http://www.w3.org/TR/WD-xsl"
>
<
xsl:template
match
="/"
>
<
html
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=gb2312"
/>
<
body
>
<
form
method
="post"
action
="EditUserData.asp"
>
<
h1
>
Edit UserInfo:
</
h1
>
<
table
border
="1"
cellpadding
="2"
>
<
xsl:for-each
select
="UserInfo/Field"
>
<
tr
>
<
td
>
<
xsl:value-of
select
="@ID"
/>
</
td
>
<
td
>
<
input
type
="text"
>
<
xsl:attribute
name
="ID"
><
xsl:value-of
select
="@ID"
/></
xsl:attribute
>
<
xsl:attribute
name
="Name"
><
xsl:value-of
select
="@ID"
/></
xsl:attribute
>
<
xsl:attribute
name
="Value"
><
xsl:value-of
select
="FieldValue"
/></
xsl:attribute
>
</
input
>
</
td
>
</
tr
>
</
xsl:for-each
>
</
table
>
<
br
/>
<
input
type
="submit"
id
="btnSubmit"
name
="btnSubmit"
value
="Edit"
/>
</
form
>
</
body
>
</
html
>
</
xsl:template
>
</
xsl:stylesheet
>
<
%
'
-----------------------------------------------------------
'
定义函数 LoadXMLFile(),接收二个参数:
'
strXMLFile - XML 文件的路径和文件名字
'
strXSLFilee - XSL 文件的路径和文件名字
'
-----------------------------------------------------------
Function
LoadXMLFile(strXMLFile, strXSLFile)
'
Declare local variables
Dim
objXML
Dim
objXSL
'
实例化 XMLDOM 对象,以便载入 XML 文件。
Set
objXML
=
Server.
CreateObject
(
"
Microsoft.XMLDOM
"
)
'
关掉文件异步载入模式。
objXML.Async
=
False
'
载入 XML 文件!
objXML.Load(strXMLFile)
'
实例化 XMLDOM 对象,以便载入 XSL 文件。
Set
objXSL
=
Server.
CreateObject
(
"
Microsoft.XMLDOM
"
)
'
关掉文件异步载入模式。
objXSL.Async
=
False
'
载入 XSL 文件!
objXSL.Load(strXSLFile)
'
利用 XMLDOM 的 transformNode 方法,把 XSL 样式表应用到 XML 文档,然后输出到客户端。
Response.Write(objXML.TransFormNode(objXSL))
End Function
'
------------------------------------------------------------------
'
函数 updateXML() 接收一个参数:strXMLFile - XML 文件的路径和文件名。
'
------------------------------------------------------------------
Function
UpdateXML(strXMLFile)
'
声明局部变量。
Dim
objDom
Dim
objRoot
Dim
objField
Dim
x
'
实例化 XMLDOM 对象。
Set
objDOM
=
Server.
CreateObject
(
"
Microsoft.XMLDOM
"
)
'
关掉文件异步载入模式。
objDom.Async
=
False
'
载入 XML 文件。
objDom.Load strXMLFile
'
设定根元素。
Set
objRoot
=
objDom.DocumentElement
'
遍历 FORM 集合,并把提交的数据写入 XML 文件。
For
x
=
1
To
Request.Form.Count
'
检查提交的数据是否包含按钮。如果是,忽略此数据。
If
Instr
(
1
,Request.Form.Key(x),
"
btn
"
)
=
0
Then
'
按照 XSL 查询模式,建立 objField 变量,把表单的元素对应到 XML 文档里的相应元素[field_value]。
Set
objField
=
objRoot.SelectSingleNode(
"
Field[@ID='
"
&
Request.Form.Key(x)
&
"
']/FieldValue
"
)
'
把表单提交的数据和 XML 文档里的节点值对应起来。
objField.Text
=
Request.Form(x)
End
If
Next
'
保存编辑过的 XML 文件。
objDom.Save strXMLFile
'
释放所有对对象的引用。
Set
objDom
=
Nothing
Set
objRoot
=
Nothing
Set
objField
=
Nothing
'
调用 LoadXMLFile 函数,把新编辑后的 XML 文件用 UpdatedUserData.xsl 样式单显示到客户端。
LoadXMLFile strXMLFile,Server.MapPath(
"
UpdatedUserData.xsl
"
)
End Function
'
检查表单是否成功提交,如提交,更新 XML 文件;否则,转到编辑状态。
If
Request.Form(
"
btnSubmit
"
)
=
""
Then
LoadXMLFile Server.MapPath(
"
UserData.xml
"
),Server.MapPath(
"
UserData.xsl
"
)
Else
UpdateXML Server.MapPath(
"
UserData.xml
"
)
End
If
%
>
当表单提交成功后,我们用UpdatedUserData.xsl来显示我们刚刚编辑的数据。
UpdatedUserData.xsl如下:
<?
xml version="1.0" encoding="gb2312"
?>
<!--
edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Dicky (Apple'S Eden)
-->
<
xsl:stylesheet
xmlns:xsl
="http://www.w3.org/TR/WD-xsl"
>
<
xsl:template
match
="/"
>
<
html
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=gb2312"
/>
<
body
>
<
h1
>
Updated UserInfo:
</
h1
>
<
table
border
="1"
cellpadding
="2"
>
<
xsl:for-each
select
="UserInfo/Field"
>
<
tr
>
<
td
>
<
xsl:value-of
select
="@ID"
/>
</
td
>
<
td
>
<
xsl:value-of
select
="FieldValue"
/>
</
td
>
</
tr
>
</
xsl:for-each
>
</
table
>
<
form
>
<
input
type
="button"
value
="Go Back"
onclick
="history.go(-1)"
/>
</
form
>
</
body
>
</
html
>
</
xsl:template
>
</
xsl:stylesheet
>
以上只是XML跨平台应用的一个简单的例子,结合具体的需求,我们可以编写功能更强大的程序来完成我们更负杂的工作。所有程序在Windows 2003 En+IIS 6.0+IE6.0+MSXML3.Dll环境下调试通过。
首先,载入我们要进行编辑的XML文档,利用微软的文档对象模型(Microsoft XMLDOM Object)和XSL,XML文档就可以在服务器端转换成可以在客户端显示的HTML文件内容。下面先看看我们使用的XML和XSL文件是什么样子的。
XML文件:UserData.xml






















XSL文件:UserData.xsl
































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




































































当表单提交成功后,我们用UpdatedUserData.xsl来显示我们刚刚编辑的数据。
UpdatedUserData.xsl如下:



























以上只是XML跨平台应用的一个简单的例子,结合具体的需求,我们可以编写功能更强大的程序来完成我们更负杂的工作。所有程序在Windows 2003 En+IIS 6.0+IE6.0+MSXML3.Dll环境下调试通过。