Los últimos tutoriales de desarrollo web
 

XSLT - Edición de XML


Los datos almacenados en archivos XML se pueden editar desde un navegador de Internet.


Abrir, editar y guardar XML

Ahora, vamos a mostrar cómo abrir, editar y guardar un archivo XML que se almacena en el servidor.

Vamos a utilizar XSL para transformar el documento XML en un formulario HTML. Los valores de los elementos XML se escriben en los campos de entrada HTML en un formulario HTML. El formulario HTML es editable. Después de editar los datos, los datos van a ser presentada de nuevo al servidor y el archivo XML se actualizará (we will show code for both PHP and ASP) .


El archivo XML y el archivo XSL

En primer lugar, echar un vistazo 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>

Ver el archivo XML .

A continuación, echar un vistazo a la hoja de estilo siguiente ("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>

Ver el archivo XSL .

El archivo XSL por encima de los bucles a través de los elementos del archivo XML y crea un campo de entrada para cada XML "field" elemento. El valor del XML "field" del elemento "id" se añade el atributo tanto a la "id" y "name" atributos de cada campo de entrada HTML. El valor de cada XML "value" se añade al elemento de "value" atributo de cada campo de entrada HTML. El resultado es un formulario HTML editable que contiene los valores del archivo XML.

Entonces, tenemos una segunda hoja de estilos: "tool_updated.xsl" . Este es el archivo XSL que se utiliza para mostrar los datos XML actualizados. Esta hoja de estilo no resultará en un formulario HTML editable, pero una tabla HTML estático:

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

Ver el archivo XSL .


El archivo ASP

El formulario HTML en el "tool.xsl" archivo de arriba tiene un atributo de acción con un valor de "edittool.asp" .

El "edittool.asp" página contiene dos funciones: Los loadFile() función carga y transforma el archivo XML para la exhibición y la updateFile() función se aplica a los cambios en el archivo 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
%>

Tip: Si usted no sabe cómo escribir ASP, por favor estudie nuestro tutorial de ASP .


El archivo PHP

En el "tool.xsl" presentar anterior, cambie el atributo action del formulario HTML para "edittool.php" .

El "edittool.php" página contiene dos funciones: Los loadFile() función carga y transforma el archivo XML para la exhibición y la updateFile() función se aplica a los cambios en el archivo 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");
}
?>

Consejo: Si usted no sabe cómo escribir PHP, por favor estudiar nuestro tutorial de PHP .

Note: Estamos haciendo la transformación y la aplicación de los cambios en el archivo XML en el servidor. Esta es una solución multi-navegador. El cliente sólo tendrá HTML desde el servidor - que funcionará en cualquier navegador.