Ultimele tutoriale de dezvoltare web
 

XSLT - Editare XML


Datele stocate în fișiere XML pot fi editate dintr-un browser de Internet.


Deschidere, Editare și Salvare XML

Acum, vom arăta cum se deschide, edita și salva un fișier XML care este stocat pe server.

Vom folosi XSL pentru a transforma documentul XML într-un formular HTML. Valorile elementelor XML vor fi scrise câmpuri de intrare HTML într-un formular HTML. Forma HTML este editabil. După editarea datelor, datele urmează să fie prezentate înapoi la server și fișierul XML va fi actualizat (we will show code for both PHP and ASP) .


Fișierul XML și fișierul XSL

În primul rând, să ia o privire la documentul 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>

Vizualizați fișierul XML .

Apoi, să ia o privire la urmatorul tabel de stil ("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>

Vizualizați fișierul XSL .

Fișierul XSL de mai sus bucle prin elementele din fișierul XML și creează un câmp de intrare pentru fiecare XML "field" elementul. Valoarea XML "field" elementului "id" atribut este adăugat atât "id" și "name" atributele fiecărui câmp de intrare HTML. Valoarea fiecărei XML "value" element este adăugat la "value" atribut al fiecărui câmp de intrare HTML. Rezultatul este un formular HTML editabil care conține valorile din fișierul XML.

Apoi, avem o a doua foaie de stil: "tool_updated.xsl" . Acesta este fișierul XSL care va fi utilizat pentru a afișa datele XML actualizate. Această foaie de stil nu va avea ca rezultat un formular HTML se poate modifica, dar un tabel HTML static:

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

Vizualizați fișierul XSL .


Fișierul ASP

Forma HTML in "tool.xsl" fișier de mai sus are un atribut de acțiune cu o valoare de "edittool.asp" .

"edittool.asp" pagina conține două funcții: loadFile() sarcinile funcționale și transformă fișierul XML pentru afișare și updateFile() funcție se aplică modificările la fișierul 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: Dacă nu știi cum să scrie ASP, vă rugăm studiul nostru tutorial ASP .


Fișierul PHP

În "tool.xsl" fișier de mai sus, schimba atributul action forma HTML la "edittool.php" .

"edittool.php" pagina conține două funcții: loadFile() sarcinile funcționale și transformă fișierul XML pentru afișare și updateFile() funcție se aplică modificările la fișierul 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");
}
?>

Sfat: Dacă nu știi cum să scrie PHP, vă rugăm studiul nostru tutorial PHP .

Note: Noi facem transformarea și aplicarea modificărilor aduse fișierul XML de pe server. Aceasta este o soluție cross-browser. Clientul va primi doar HTML înapoi de la server - care va lucra în orice browser.