用XSL.ASP編輯XML文檔
發(fā)表時(shí)間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]簡介 本文是"保存至HTML 表格數(shù)據(jù)至XML"的姐妹篇。如果你沒讀過上文,我建議您最好先瀏覽一下。本文是建立在上文基礎(chǔ)之上的。關(guān)于上文的舉例,讀者不斷給予了肯定的回應(yīng),同樣的,很多人都想知道如何編輯XML數(shù)據(jù)。因此,我寫下了此文! ∈褂肵SL狀態(tài)下:打開一個(gè)XML文件,確...
簡介
本文是"保存至HTML 表格數(shù)據(jù)至XML"的姐妹篇。如果你沒讀過上文,我建議您最好先瀏覽一下。本文是建立在上文基礎(chǔ)之上的。關(guān)于上文的舉例,讀者不斷給予了肯定的回應(yīng),同樣的,很多人都想知道如何編輯XML數(shù)據(jù)。因此,我寫下了此文。
使用XSL狀態(tài)下:打開一個(gè)XML文件,確定將對它進(jìn)行編輯、傳送至HTML表單,并最終將傳送到瀏覽器。 此XML元素的值將會被設(shè)置成HTML輸入域的值。在這些必要的編輯后,則可將這些經(jīng)處理的信息提交至服務(wù)器,XML文件同時(shí)也被更新。
第一步LOAD你將會編輯并在瀏覽器以HTML表格形式出現(xiàn)的文件。在以下的舉例中,XML在服務(wù)器上的變化被我跳過了,在使用微軟的XMLDOM 目標(biāo)下,XML文件是能被XSL文件轉(zhuǎn)化的。我們在此同樣可以用到這個(gè)技巧來轉(zhuǎn)化XML文件。
XML File: contact.xml:
<?xml version="1.0" ?>
。糲ontact>
。糵ield id="firstName" taborder="1">
<field_value>Michael</field_value>
。/field>
。糵ield id="lastName" taborder="2">
。糵ield_value>Qualls</field_value>
。/field>
。糵ield id="address1" taborder="3">
。糵ield_value>202 East Haverbrook</field_value>
</field>
。糵ield id="address2" taborder="4">
。糵ield_value>Oklahoma City, OK 73114</field_value>
。/field>
。糵ield id="phone" taborder="5">
。糵ield_value>4055551234</field_value>
。/field>
。糵ield id="email" taborder="6">
<field_value>mqualls@vertiscope.com</field_value>
。/field>
。/contact>
本文舉例用到的XML文件與 "保存HTML表格至XML"一文中的舉例一樣。因此你能夠更直觀的觀察到其中的關(guān)聯(lián)之處。
XSL File: contact.xsl:
。?xml version="1.0"?>
。紉sl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
。紉sl:template match="/">
。糷tml>
。糱ody>
。糵orm method="post" action="EditContact.asp">
。糷1>Edit Contact:</h1>
。紅able border="1" cellpadding="2">
。紉sl:for-each select="contact/field">
<tr>
。紅d>
。紉sl:value-of select="@id"/>
</td>
。紅d>
。糹nput type="text">
。紉sl:attribute name="id">
。紉sl:value-of select="@id" />
。/xsl:attribute>
<xsl:attribute name="name">
。紉sl:value-of select="@id" />
。/xsl:attribute>
。紉sl:attribute name="value">
。紉sl:value-of select="field_value" />
</xsl:attribute>
。/input>
</td>
。/tr>
。/xsl:for-each>
</table>
。糹nput type="submit" id="btnSubmit" name="btnSubmit" value="Submit" />
</form>
。/body>
。/html>
。/xsl:template>
。/xsl:stylesheet>
這個(gè)XSL文件使用了for-each XSL元素,使之在XSL文件的元素中反復(fù)。
由此根元素開始,每個(gè)XML"域"元素的"ID"被寫成了HTML文本域的"ID"和"NAME"。
同樣,XML文件中"域值/FIELD_VALUE"元素的值也被寫成為每個(gè)HTML文本域中的"值/value"。最后的結(jié)果自然是HTML格式包含了來自XML文件中將會被編輯的值。
我之所以把"ID"從XML文件中的"域"元素里提出來,并把它置于XSL文件中的HTML文本域中,是為了不至于混淆并且可以促進(jìn)命名的連貫性。這樣的話,不太熟悉編碼知識的朋友也能分辨出哪個(gè)XML域配哪 個(gè)HTML域。
通過使用上述兩個(gè)文件,我們已為開始編輯XML文件做好了充分準(zhǔn)備。XSL文件將會傳輸XML文件以便能夠在瀏覽器上顯示。我們可以在終端機(jī)上做這個(gè)傳輸工作,但不是最好的解決方案。用ASP的話,我們可以在服務(wù)器上做這個(gè)傳輸工作。同樣的,我們可以在服務(wù)器上做XML文件的編輯工作。
例子:通過使用XSL,ASP來編輯XML
編輯 Contact.asp 是一個(gè)比較普遍的現(xiàn)象。這兒有兩個(gè)功能在編輯ASP頁面中起了主要作用。第一個(gè)是loadXMLFile功能,它LOAD并傳輸XML文件使之顯示出來;第二個(gè)是 updateXML 功能,它適用于編輯 XML文件國。
ASP File: EditContact.asp:
<%
'-----------------------------------------------------------
'"loadXMLFile" 函數(shù)接受兩個(gè)參數(shù).
'strXMLFile - XML文件的路徑名和文件名.
'strXSLFilee - XSL文件的路徑名和文件名.
'-----------------------------------------------------------
Function loadXMLFile(strXMLFile, strXSLFile)
'本地變量
Dim objXML Dim objXSL
'初始化XMLDOM對象.
set objXML = Server.CreateObject("Microsoft.XMLDOM")
'關(guān)閉同步加載的文件.
objXML.async = false
'加載XML文件.
objXML.load(strXMLFile)
'初始化用于加載XSL文件的XMLDOM對象.
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
'Turn off asyncronous file loading.
objXSL.async = false 'Load the XSL file.
objXSL.load(strXSLFile)
'Use the "transformNode" method of the XMLDOM to apply the
'XSL stylesheet to the XML document. Then the output is
'written to the client.
Response.Write(objXML.transformNode(objXSL))
End Function
'-----------------------------------------------------------
'The "updateXML" Function accepts one parameter.
'strXMLFile - The path and file name of the XML file.
'-----------------------------------------------------------
Function updateXML(strXMLFile)
'Declare local variables.
Dim objDom
Dim objRoot
Dim objField
Dim x
'Instantiate the XMLDOM Object.
set objDOM = Server.CreateObject("Microsoft.XMLDOM")
'Turn off asyncronous file loading.
objDOM.async = false
'Load the XML file.
objDOM.load strXMLFile
'Set the objRoot variable equal to the root element of the
'XML file by calling the documentElement method of the
'objDOM (XMLDOM) object.
Set objRoot = objDom.documentElement
'Iterate through the Form Collection and write the
'submitted values to the XML file.
For x = 1 to Request.Form.Count
'Check see if "btn" is in the submitted value, if so,
'it is a button and should be ignored.
If instr(1,Request.Form.Key(x),"btn") = 0 Then
'Set objField variable equal to a field_value element by
'calling the selectSingleNode method of the objRoot
'(documentElement) object. The SelectSingleNode method
'accepts a string parameter for querying the XML document.
'In this case, the current value of the key property of
'the Form Collection is used to find the appropriate
'field_value element (more on this later).
Set objField = objRoot.selectSingleNode("field[@id='" & _ Request.Form.Key(x) & "']/field_value")
'Set the text property of the objField (field_value)
'element equal to the value of the current form field.
objField.Text = Request.Form(x)
End If
Next
'After the XML file has been edited, is must be saved.
objDom.save strXMLFile
'Release all of your object references.
Set objDom = Nothing
Set objRoot = Nothing
Set objField = Nothing
'Call the loadXMLFile method, passing in the newly edited
'XML file and the updatedcontact.xsl style sheet. This will
'allow the client to see the edited information. More on the
'updatedcontact.xsl file later.
loadXMLFile strXMLFile,
server.MapPath("updatedcontact.xsl")
End Function
'Test to see if the form has been submitted. If it has,
'update the XML file. If not, transform the XML file for
'editing.
If Request.Form("btnSubmit") = "" Then
loadXMLFile server.MapPath("Contact.xml"), _ server.MapPath("contact.xsl")
Else
updateXML server.MapPath("Contact.xml")
End If
%>
正如你所看到的一樣,ASP文件處理了整個(gè)XML文件更新的過程。如果表單已被提交,那么XML文件則會被打開并更新。如果表單沒有被提交,那么XML文件會由contact.xsl傳送至HTML格式,以便用戶自行編輯。詳見以下舉例:
For x = 1 to Request.Form.Count
If instr(1,Request.Form.Key(x),"btn") = 0 Then
Set objField = objRoot.selectSingleNode("field[@id='" & _ Request.Form.Key(x) & "']/field_value")
objField.Text = Request.Form(x)
End If
Next
上述代碼是更新XML文件的代碼。SelectSingleNode 方法是關(guān)鍵。
在上述舉例中,問句是"field[@id='"& request.form.key(x) & "']/field_value"。所詢問的是:要求做為 子域元素 的field_value element 包含一個(gè)"ID",此ID而且是與現(xiàn)有的Form Collection中的關(guān)鍵值相匹配。一旦獲得適當(dāng)?shù)墓?jié)點(diǎn),則可以更新文本屬性以便與Form Collection中的值相匹配。