Edición de XML con XSLT

Los datos almacenados en el archivo XML pueden ser editados a través de un navegador de internet.

Abrir, editar y guardar XML

Ahora, le mostraremos cómo abrir, editar y guardar un archivo XML almacenado en el servidor.

Vamos a usar XSL para convertir un documento XML a un formulario HTML. Los valores de los elementos XML se escribirán en los campos de entrada HTML del formulario. Este formulario es editable. Después de ser editado, los datos se enviarán de vuelta al servidor y el archivo XML se actualizará (esta parte se realiza con ASP).

Archivo XML y archivo XSL

Primero, vea el documento XML que se utilizará ("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>

Ver archivo XML.

A continuación, vea la hoja de estilo siguiente ("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>Información de Herramienta (editar):</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>

View XSL file.

Este archivo XSL recorrerá iterativamente los elementos del archivo XML y creará un campo de entrada para cada elemento "field" XML. El valor del atributo "id" del elemento "field" se añade a los atributos "id" y "name" de cada campo de entrada HTML. El valor del elemento "value" se añade al atributo "value" de cada campo de entrada HTML. Como resultado, se puede obtener un formulario HTML editable que contiene los valores del archivo XML.

Then, we also have a second stylesheet: "tool_updated.xsl". This XSL file will be used to display the updated XML data. This stylesheet will not output an editable HTML form, but a static HTML table:

<?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>

View XSL file.

ASP file

In the "tool.xsl" file, the value of the action attribute of the HTML form is "edittool.asp" .

"edittool.asp" page includes two functions: loadFile() loads and transforms XML files, updateFile() function updates XML files:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
cargar el archivo XML
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
cargar el archivo XML
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
establecer la variable rootEl como el elemento raíz
Set rootEl = xmlDoc.documentElement
recorrer el conjunto de formularios
for i = 1 To Request.Form.Count
   eliminar los elementos de botón del formulario
   if instr(1,Request.Form.Key(i),"btn_")=0 then
   el método selectSingleNode puede buscar un nodo único en un archivo XML que coincida con una consulta
   esta consulta solicitará el elemento value, que es un subelemento del elemento field
   este elemento field posee una propiedad id que puede coincidir con el valor actual del key en el conjunto de formularios
   si existe una coincidencia, configure la propiedad text con el valor actual del campo en el conjunto de formularios
   set f = rootEl.selectSingleNode("field[@id='" & _
   Request.Form.Key(i) & "/value")
   f.Text = Request.Form(i)
   end if
next
guardar el archivo XML modificado
xmlDoc.save xmlfile
liberar todas las referencias a objetos
set xmlDoc=nothing
set rootEl=nothing
set f=nothing
cargar el archivo XML modificado mediante una hoja de estilo, de modo que el cliente pueda ver la información editada
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function
si el formulario ya ha sido enviado, actualice el archivo XML y muestre los resultados, de lo contrario, convierta este archivo XML para editar
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

Consejo:Si no conoce cómo escribir ASP, aprenda de nuestroTutorial de ASP》。

Comentario:Estamos convirtiendo y actualizando los archivos XML ubicados en el servidor. Esta es una solución multiplataforma. El cliente solo puede obtener HTML devuelto por el servidor, que puede ejecutarse en cualquier navegador.