XSLT - Modifica XML

I dati memorizzati nei file XML possono essere modificati tramite un browser Internet.

Aprire, modificare e salvare XML

Ora, vi mostreremo come aprire, modificare e salvare i file XML archiviati sul server.

Utilizzeremo XSL per convertire un documento XML in un modulo HTML. I valori degli elementi XML saranno scritti nei campi di input HTML. Questo modulo è modificabile. Dopo essere stato modificato, i dati saranno inviati indietro al server e il file XML verrà aggiornato (questo viene fatto da ASP).

File XML e file XSL

Prima di tutto, ecco il documento XML che verrà utilizzato ("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>

Visualizza il file XML.

Ecco il foglio di stile seguente ("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.asp">
<h2>Informazioni sull'strumento (modifica):</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>

Visualizza il file XSL.

Questo file XSL esegue un ciclo su gli elementi del file XML e crea un campo di input per ogni elemento "field" XML. Il valore dell'attributo "id" dell'elemento "field" viene aggiunto a entrambi gli attributi "id" e "name" di ogni campo HTML di input. Il valore dell'elemento "value" viene aggiunto all'attributo "value" di ogni campo HTML di input. Di conseguenza, si ottiene un modulo HTML editabile che contiene i valori del file XML.

Poi, abbiamo anche un secondo foglio di stili: "tool_updated.xsl". Questo file XSL verrà utilizzato per visualizzare i dati XML aggiornati. Questo foglio di stili non esporterà un modulo HTML modificabile, ma una tabella HTML statica:

<?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>Informazioni aggiornate dello strumento:</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>

Visualizza il file XSL.

File ASP

Nel file "tool.xsl", il valore dell'attributo action del modulo HTML è "edittool.asp".

"edittool.asp" pagina contiene due funzioni: loadFile() per caricare e trasformare il file XML, updateFile() per aggiornare il file XML:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Caricare il file XML
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
加载 XSL 文件
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
'Caricare il file XML
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
'Impostare la variabile rootEl come l'elemento radice
Set rootEl = xmlDoc.documentElement
'Eseguire un ciclo attraverso la collezione form
for i = 1 To Request.Form.Count
   'Eliminare gli elementi pulsante del modulo
   if instr(1,Request.Form.Key(i),"btn_")=0 then
   'Il metodo selectSingleNode può cercare un singolo nodo nel file XML che corrisponde a una query specifica.
   'Questa query richiede l'elemento value, che è un figlio dell'elemento field,
   'Questo elemento field possiede un attributo id che può corrispondere al valore corrente del key nel modulo.
   'Se esiste una corrispondenza, impostare l'attributo text con il valore del campo corrente del modulo.
   set f = rootEl.selectSingleNode("field[@id='" & _
   Request.Form.Key(i) & "/value")
   f.Text = Request.Form(i)
   end if
next
'Salvare il file XML modificato
xmlDoc.save xmlfile
'Rilasciare tutte le referenze agli oggetti
set xmlDoc=nothing
set rootEl=nothing
set f=nothing
'Caricare il file XML modificato attraverso uno stile di foglio, in modo che il client possa vedere le informazioni modificate
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function
'Se il modulo è stato inviato, aggiornare il file XML e visualizzare i risultati, altrimenti convertire questo file XML per la modifica
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

Suggerimento:Se non conosci come scrivere ASP, studia il nostroTutorial di ASP">

Nota:Stiamo convertendo e aggiornando i file XML presenti sul server. Questa è una soluzione cross-platform. Il client può ricevere solo l'HTML restituito dal server, che può essere eseguito su qualsiasi browser.