Derniers tutoriels de développement web
 

XSLT - Modification du contenu XML


Les données stockées dans des fichiers XML peuvent être modifiés à partir d'un navigateur Internet.


Ouvrir, modifier et enregistrer XML

Maintenant, nous allons montrer comment ouvrir, modifier et enregistrer un fichier XML qui est stocké sur le serveur.

Nous utiliserons pour transformer le XSL document XML en un formulaire HTML. Les valeurs des éléments XML seront écrits dans les champs de saisie HTML dans un formulaire HTML. Le formulaire HTML est modifiable. Après avoir modifié les données, les données vont être soumises au serveur et le fichier XML sera mis à jour (we will show code for both PHP and ASP) .


Le fichier XML et le fichier XSL

Tout d' abord, jetez un oeil au document 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>

Voir le fichier XML .

Ensuite, jetez un oeil à la feuille de style suivante ("tool.xsl") le ("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>

Voir le fichier XSL .

Le fichier XSL boucles au- dessus à travers les éléments dans le fichier XML et crée un champ d'entrée pour chaque XML "field" élément. La valeur du XML "field" élément de "id" attribut est ajouté à la fois le "id" et "name" attributs de chaque champ de saisie HTML. La valeur de chaque XML "value" élément est ajouté à la "value" attribut de chaque champ d'entrée HTML. Le résultat est un formulaire HTML modifiable qui contient les valeurs à partir du fichier XML.

Ensuite, nous avons une deuxième feuille de style: "tool_updated.xsl" . Ceci est le fichier XSL qui sera utilisé pour afficher les données XML mises à jour. Cette feuille de style ne résultera pas en une forme HTML modifiable, mais une table HTML statique:

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

Voir le fichier XSL .


Le fichier ASP

Le formulaire HTML dans le "tool.xsl" fichier ci - dessus a un attribut d'action avec une valeur de "edittool.asp" .

Le "edittool.asp" page contient deux fonctions: Les loadFile() fonction charge et transforme le fichier XML pour l' affichage et la updateFile() fonction applique les modifications apportées au fichier 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 vous ne savez pas comment écrire ASP, s'il vous plaît étudier notre tutoriel ASP .


Le fichier PHP

Dans le "tool.xsl" fichier ci - dessus, changer l'attribut d'action de formulaire HTML pour "edittool.php" .

Le "edittool.php" page contient deux fonctions: Les loadFile() fonction charge et transforme le fichier XML pour l' affichage et la updateFile() fonction applique les modifications apportées au fichier 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");
}
?>

Astuce: Si vous ne savez pas comment écrire PHP, s'il vous plaît étudier notre tutoriel PHP .

Note: Nous faisons la transformation et l' application des modifications apportées au fichier XML sur le serveur. Ceci est une solution multi-navigateur. Le client ne fera que HTML à partir du serveur - qui fonctionnera dans un navigateur.