XSLT - 編輯 XML
儲存在 XML 檔案中的資料可以透過 Internet 瀏覽器進行編輯。
開啟、編輯和儲存 XML
現在,我們將展示如何開啟、編輯和儲存儲存在伺服器上的 XML 檔案。
我們將使用 XSL 將 XML 文件轉換為 HTML 表單。XML 元素的值將被寫入 HTML 表單中的 HTML 輸入欄位。HTML 表單是可編輯的。編輯資料後,資料將提交回伺服器,並且 XML 檔案將被更新(我們將同時展示 PHP 和 ASP 的程式碼)。
XML 檔案和 XSL 檔案
首先,看一下 XML 文件 ("tool.xml")
<?xml version="1.0" encoding="UTF-8"?>
<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="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<form method="post" action="edittool.asp">
<h2>工具資訊(編輯):</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" 屬性中。結果是一個可編輯的 HTML 表單,其中包含 XML 檔案中的值。
然後,我們有第二個樣式表:"tool_updated.xsl"。這是用於顯示更新的 XML 資料的 XSL 檔案。此樣式表不會生成可編輯的 HTML 表單,而是生成一個靜態 HTML 表格。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>更新的工具資訊:</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>
PHP 檔案
在上面的 "tool.xsl" 檔案中,將 HTML 表單的 action 屬性更改為 "edittool.php"。
"edittool.php" 頁面包含兩個函式:loadFile() 函式載入並轉換 XML 檔案以供顯示,updateFile() 函式將更改應用於 XML 檔案。
<?php
function loadFile($xml, $xsl)
{
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$xslDoc = new DOMDocument();
$xslDoc->load($xsl);
$proc = new XSLTProcessor();
$proc->importStyleSheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
}
function updateFile($xml)
{
$xmlLoad = simplexml_load_file($xml);
$postKeys = array_keys($_POST);
foreach($xmlLoad->children() as $x)
{
foreach($_POST as $key=>$value)
{
if($key == $x->attributes())
{
$x->value = $value;
}
}
}
$xmlLoad->asXML($xml);
loadFile($xml,"tool_updated.xsl");
}
if($_POST["btn_sub"] == "")
{
loadFile("tool.xml", "tool.xsl");
}
else
{
updateFile("tool.xml");
}
?>
提示:如果您不知道如何編寫 PHP,請學習我們的 PHP 教程。
注意:我們正在伺服器上執行轉換並將更改應用於 XML 檔案。這是一個跨瀏覽器解決方案。客戶端將只從伺服器獲取 HTML - 這將在任何瀏覽器中工作。
ASP 檔案
上面 "tool.xsl" 檔案中的 HTML 表單有一個 action 屬性,其值為 "edittool.asp"。
"edittool.asp" 頁面包含兩個函式:loadFile() 函式載入並轉換 XML 檔案以供顯示,updateFile() 函式將更改應用於 XML 檔案。
<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'載入 XML 和 XSL 檔案
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
set xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
'轉換檔案
Response.Write(xmlDoc.transformNode(xslDoc))
end function
function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
'載入 XML 檔案
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
'將 rootEl 變數設定為根元素
Set rootEl = xmlDoc.documentElement
'遍歷表單集合
for i = 1 To Request.Form.Count
'消除表單中的按鈕元素
if instr(1,Request.Form.Key(i),"btn_")=0 then
'selectSingleNode 方法查詢 XML 檔案以查詢匹配查詢的單個節點
'此查詢請求是具有與表單集合中當前鍵值匹配的 id 屬性的 field 元素的 value 子元素。當匹配時 -
'將 text 屬性設定為表單集合中當前欄位的值。
'設定文字屬性等於表單集合中當前欄位的值。
'將 text 屬性設定為表單集合中當前欄位的值。
'將 text 屬性設定為表單集合中當前欄位的值。
set f = rootEl.selectSingleNode("field[@id='" & _
Request.Form.Key(i) & "']/value")
f.Text = Request.Form(i)
end if
next
'儲存修改後的 XML 檔案
xmlDoc.save xmlfile
'釋放所有物件引用
set xmlDoc=nothing
set rootEl=nothing
set f=nothing
'使用樣式表載入修改後的 XML 檔案,該樣式表
'允許客戶端檢視編輯後的資訊
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function
'如果表單已提交,則更新 XML 檔案並顯示結果
' - 否則,轉換 XML 檔案以進行編輯
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>