XSLT - Modifica XML
I dati memorizzati nei file XML possono essere modificati da un browser Internet.
Apri, modifica e salva XML
Ora mostreremo come aprire, modificare e salvare un file XML archiviato sul server.
Useremo XSL per trasformare il documento XML in un modulo HTML. I valori degli elementi XML verranno scritti nei campi di input HTML in un modulo HTML. Il modulo HTML è modificabile. Dopo aver modificato i dati, i dati verranno reinviati al server e il file XML verrà aggiornato (mostreremo il codice sia per PHP che per ASP).
Il file XML e il file XSL
Per prima cosa, dai un'occhiata al documento 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>
Quindi, dai un'occhiata al seguente foglio di stile ("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>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>
Il file XSL sopra scorre gli elementi nel file XML e crea un campo di input per ogni elemento "campo" XML. Il valore dell'attributo "id" dell'elemento "field" XML viene aggiunto agli attributi "id" e "name" di ciascun campo di input HTML. Il valore di ogni elemento "valore" XML viene aggiunto all'attributo "valore" di ogni campo di input HTML. Il risultato è un modulo HTML modificabile che contiene i valori del file XML.
Quindi, abbiamo un secondo foglio di stile: "tool_updated.xsl". Questo è il file XSL che verrà utilizzato per visualizzare i dati XML aggiornati. Questo foglio di stile non risulterà in un modulo HTML modificabile, ma in una tabella HTML statica:
<?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>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>
Il file PHP
Nel file "tool.xsl" sopra, cambia l'attributo action del modulo HTML in "edittool.php".
La pagina "edittool.php" contiene due funzioni: La funzione loadFile() carica e trasforma il file XML per la visualizzazione e la funzione updateFile() applica le modifiche al file 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");
}
?>
Suggerimento: se non sai come scrivere PHP, studia il nostro tutorial PHP .
Nota: stiamo eseguendo la trasformazione e applicando le modifiche al file XML sul server. Questa è una soluzione cross-browser. Il client otterrà solo HTML dal server, che funzionerà in qualsiasi browser.
Il file ASP
Il modulo HTML nel file "tool.xsl" sopra ha un attributo di azione con un valore di "edittool.asp".
La pagina "edittool.asp" contiene due funzioni: La funzione loadFile() carica e trasforma il file XML per la visualizzazione e la funzione updateFile() applica le modifiche al file XML:
<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Load XML and XSL file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
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 form is 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
%>