XSLT - XML の編集


XML ファイルに保存されたデータは、インターネットブラウザで編集することができます。


XML を開いて、編集して、保存する

ここでは、サーバーに保存されている XML ファイルを開いて、編集し、保存する方法を説明します。

XSL を使用して XML ドキュメントを HTML フォームに変換します。XML 要素の値は、HTML フォーム内の HTML 入力フィールドに書き込まれます。この HTML フォームは編集可能です。編集が完了すると、データはサーバーに送信され、XML ファイルが更新されます(この部分は ASP が行います)。


XML ファイルと XSL ファイル

まず、使用する XML ドキュメント("tool.xml")を確認しましょう。

<?xml version="1.0" encoding="ISO-8859-1"?>
<tool>
<field id="prodName">
<value>HAMMER HG2606</value>
</field>
<field id="prodNo">
<value>32456240</value>
</field>
<field id="price">
<value>$30.00</value>
</field>
</tool>

。

次に、以下のスタイルシート("tool.xsl")を確認しましょう。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<form method="post" action="edittool.html">
<h2>Tool Information (edit):</h2>
<table border="0">
<xsl:for-each select="tool/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="value" />
</xsl:attribute>
</input>
</td>
</tr>
</xsl:for-each>
</table>
<br />
<input type="submit" id="btn_sub" name="btn_sub" value="Submit" />
<input type="reset" id="btn_res" name="btn_res" value="Reset" />
</form>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

。

上記の XSL ファイルは、XML ファイル内の要素をループ処理し、各 XML "field" 要素に対して入力フィールドを作成します。XML "field" 要素の "id" 属性の値は、各 HTML 入力フィールドの "id" 属性と "name" 属性に追加されます。各 XML "value" 要素の値は、各 HTML 入力フィールドの "value" 属性に追加されます。その結果、XML ファイルの値を含む編集可能な HTML フォームが得られます。

次に、2 番目のスタイルシート "tool_updated.xsl" があります。この XSL ファイルは、更新された XML データを表示するために使用されます。このスタイルシートは編集可能な HTML フォームではなく、静的な HTML テーブルを出力します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>Updated Tool Information:</h2>
<table border="1">
<xsl:for-each select="tool/field">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="value" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

。


ASP ファイル

上記の "tool.xsl" ファイルでは、HTML フォームの action 属性の値は "edittool.asp" です。

"edittool.asp" ページには 2 つの関数があります。loadFile() 関数は XML ファイルを読み込んで変換し、updateFile() 関数は XML ファイルを更新します。

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
'Load XSL file
set xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
'Transform file
Response.Write(xmlDoc.transformNode(xslDoc))
end function

function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)

'Set the rootEl variable equal to the root element
Set rootEl = xmlDoc.documentElement

'Loop through the form collection
for i = 1 To Request.Form.Count
'Eliminate button elements in the form
if instr(1,Request.Form.Key(i),"btn_")=0 then
'The selectSingleNode method queries the XML file for a single node
'that matches a query. This query requests the value element that is
'the child of a field element that has an id attribute which matches
'the current key value in the Form Collection. When there is a match -
'set the text property equal to the value of the current field in the
'Form Collection.
set f = rootEl.selectSingleNode("field[@id='" & _
Request.Form.Key(i) & "']/value")
f.Text = Request.Form(i)
end if
next

'Save the modified XML file
xmlDoc.save xmlfile

'Release all object references
set xmlDoc=nothing
set rootEl=nothing
set f=nothing

'Load the modified XML file with a style sheet that
'allows the client to see the edited information
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function

'If the form has been submitted update the
'XML file and display result - if not,
'transform the XML file for editing
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

ヒント:ASP の書き方がわからない場合は、次のチュートリアルを参照してください。ASP チュートリアル。

注意:サーバー上にある XML ファイルを変換して更新しています。これはクロスプラットフォームのソリューションです。クライアントはサーバーから返された HTML のみを受け取ります。そして HTML はどのブラウザでも動作します。


その他の拡張