XSLT - Editace XML
Data uložená v souborech XML lze upravovat z internetového prohlížeče.
Otevřít, upravit a uložit XML
Nyní si ukážeme, jak otevřít, upravit a uložit soubor XML, který je uložen na serveru.
Pomocí XSL převedeme XML dokument do HTML podoby. Hodnoty prvků XML budou zapsány do vstupních polí HTML ve formě HTML. HTML formulář je editovatelný. Po úpravě dat budou data odeslána zpět na server a dojde k aktualizaci XML souboru (ukážeme kód pro PHP i ASP).
Soubor XML a soubor XSL
Nejprve se podívejte na dokument 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>
Pak se podívejte na následující šablonu stylů ("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>
Výše uvedený soubor XSL prochází prvky v souboru XML a vytváří jedno vstupní pole pro každý prvek „pole“ XML. Hodnota atributu „id“ prvku XML „field“ je přidána k atributům „id“ a „name“ každého vstupního pole HTML. Hodnota každého prvku XML „value“ je přidána k atributu „value“ každého vstupního pole HTML. Výsledkem je upravitelný HTML formulář, který obsahuje hodnoty ze souboru XML.
Pak máme druhou šablonu stylů: "tool_updated.xsl". Toto je soubor XSL, který bude použit k zobrazení aktualizovaných dat XML. Výsledkem této šablony stylů nebude upravitelný formulář HTML, ale statická tabulka HTML:
<?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>
Soubor PHP
V souboru „tool.xsl“ výše změňte atribut akce formuláře HTML na „edittool.php“.
Stránka "edittool.php" obsahuje dvě funkce: Funkce loadFile() načte a transformuje soubor XML pro zobrazení a funkce updateFile() aplikuje změny na soubor 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");
}
?>
Tip: Pokud nevíte, jak psát PHP, prostudujte si prosím náš PHP tutoriál .
Poznámka: Provádíme transformaci a aplikujeme změny na soubor XML na serveru. Toto je řešení pro různé prohlížeče. Klient dostane zpět pouze HTML ze serveru - což bude fungovat v jakémkoli prohlížeči.
Soubor ASP
HTML formulář v souboru "tool.xsl" výše má atribut action s hodnotou "edittool.asp".
Stránka "edittool.asp" obsahuje dvě funkce: Funkce loadFile() načte a transformuje soubor XML pro zobrazení a funkce updateFile() aplikuje změny na soubor 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
%>