利用XSL和ASP在线编辑XML文档
生活随笔
收集整理的這篇文章主要介紹了
利用XSL和ASP在线编辑XML文档
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文通過一個詳細的例子,來闡述了在線編輯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>
<!--?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
<?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>
XSL文件:UserData.xsl
<!--?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>
XSL文件使用了XSL:for-each元素的來遍歷整個XML文件,XML文件里每個“field”元素的“id”屬性和HTML表單的文本輸入框的“id”和“name”相對應。這樣,HTML表單的文本輸入框就顯示出了XML文件的元素值。此文件負責XML文檔在服務器端的轉換,以便能在各種瀏覽器上顯示。
下面是關鍵的程序,它實現打開和更新XML文檔的功能,并根據表單的提交與否,來決定是否進行更新。它包含了兩個函數,loadXMLFile負責載入和轉換要顯示的XML文件;updateXML函數負責更新XML文件。
EditUserData.asp程序如下:
'-----------------------------------------------------------?
'定義函數?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環境下調試通過。
轉載于:https://www.cnblogs.com/Dicky/archive/2005/03/24/125173.html
總結
以上是生活随笔為你收集整理的利用XSL和ASP在线编辑XML文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React + webpack 开发单页
- 下一篇: python之scrapy:攻克技术点A