XSLT - edycja XML

Dane przechowywane w pliku XML można edytować za pomocą przeglądarki internetowej.

Otwieranie, edytowanie i zapisywanie XML

Teraz pokażemy, jak otworzyć, edytować i zapisać plik XML przechowywany na serwerze.

Użyjemy XSL do przekształcenia dokumentu XML do formularza HTML. Wartości elementów XML będą zapisywane w polach wejściowych HTML formularza. Ten formularz jest edytowalny. Po zakończeniu edycji dane będą wysłane z powrotem do serwera, a plik XML zostanie zaktualizowany (to jest zrobione przez ASP).

Pliki XML i XSL

Oto dokument XML, który zostanie użyty ("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 PLN</value> 
  </field>
</tool>

Zobacz plik XML.

Następnie, zobacz poniższy arkusz stylów ("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>Informacje o narzędziu (edytowanie):</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>

Zobacz plik XSL.

Wymieniony powyżej plik XSL będzie przechodził przez elementy pliku XML i dla każdego elementu "field" XML utworzy pole wejściowe. Wartość atrybutu id elementu field zostanie dodana do atrybutów id i name każdego pola wejściowego HTML. Wartość elementu "value" zostanie dodana do atrybutu "value" każdego pola wejściowego HTML. W rezultacie można uzyskać formularz HTML do edycji zawierający wartości z pliku XML.

Następnie mamy drugą tablicę stylową: "tool_updated.xsl". Ten plik XSL będzie używany do wyświetlania zaktualizowanych danych XML. Ta tablica stylowa nie wyświetli formularza HTML do edycji, ale statystyczny tabelę HTML:

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

Zobacz plik XSL.

Plik ASP

W pliku "tool.xsl", wartość atrybutu action formularza HTML wynosi "edittool.asp".

Strona "edittool.asp" zawiera dwie funkcje: loadFile() do załadowania i konwersji pliku XML oraz updateFile() do aktualizacji pliku XML:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
Ładowanie pliku XML
ustaw xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
Ładowanie pliku XSL
ustaw xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
Przekształcanie pliku
Response.Write(xmlDoc.transformNode(xslDoc))
end function
function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
Ładowanie pliku XML
ustaw xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
Ustawienie zmiennej rootEl na element korzenia
Set rootEl = xmlDoc.documentElement
Przetwarzanie zbioru formularzy
for i = 1 To Request.Form.Count
   Usunięcie elementów przycisków z formularza
   Jeśli instr(1,Request.Form.Key(i),"btn_")=0 then
   Metoda selectSingleNode może wyszukiwać pojedynczy węzeł w pliku XML, który pasuje do zapytania.
   To zapytanie będzie prosić o element value, który jest podelementem elementu field,
   Ten element field ma atrybut id, który można dopasować do bieżącej wartości klucza formularza.
   Jeśli istnieje dopasowanie, ustaw atrybut text na wartość bieżącego pola formularza.
   ustaw f = rootEl.selectSingleNode("field[@id='" & _
   Request.Form.Key(i) & "/value")
   f.Text = Request.Form(i)
   end if
next
Zapisz zmodyfikowany plik XML
xmlDoc.save xmlfile
Zwolnienie wszystkich odniesień do obiektów
ustaw xmlDoc=nothing
ustaw rootEl=nothing
ustaw f=nothing
Ładowanie zmodyfikowanego pliku XML za pomocą arkusza stylów, tak aby klient mógł zobaczyć edytowane informacje
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function
'Jeśli formularz został złożony, zaktualizuj plik XML i wyświetl wynik, jeśli nie został złożony, przejdź do konwersji tego pliku XML do edycji
if Request.Form("btn_sub")="" then
loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
updateFile server.MapPath("tool.xml")
end if
%>

Wskazówka:Jeśli nie wiesz, jak pisać ASP, naucz się naszego:Tutorial ASP》。

Komentarz:Przetwarzamy i aktualizujemy plik XML znajdujący się na serwerze. Jest to rozwiązanie wieloplatformowe. Klient może uzyskać tylko HTML zwrócony przez serwer - a HTML może być uruchomiony w każdej przeglądarce.