أحدث البرامج التعليمية وتطوير الشبكة
 

XSLT - تحرير XML


البيانات المخزنة في ملفات XML يمكن أن تعدل من متصفح الإنترنت.


فتح وتحرير وحفظ XML

الآن، وسوف نعرض كيفية فتح، تعديل، وحفظ ملف XML المخزنة على الخادم.

سوف نستخدم XSL لتحويل وثيقة XML في شكل HTML. سيتم كتابة القيم من عناصر XML إلى حقول الإدخال HTML في شكل HTML. شكل HTML غير قابل للتحرير. بعد تحرير البيانات، والبيانات سوف يتم تقديمها مرة أخرى إلى الخادم وسيتم تحديث ملف XML (we will show code for both PHP and ASP) .


ملف XML وملف XSL

أولا، نلقي نظرة على وثيقة 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>

عرض ملف XML .

ثم، نلقي نظرة على ورقة النمط التالي ("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>

عرض ملف XSL .

ملف XSL فوق حلقات عبر عناصر في ملف XML ويخلق حقل إدخال واحد لكل XML "field" العنصر. قيمة XML "field" العنصر "id" يتم إضافة السمة إلى كل من "id" و "name" سمات كل حقل إدخال HTML. قيمة كل XML "value" يتم إضافة عنصر إلى "value" سمة من كل حقل إدخال HTML. والنتيجة هي شكل HTML للتحرير الذي يحتوي على القيم من ملف XML.

ثم، لدينا ورقة أنماط الثانية: "tool_updated.xsl" . هذا هو ملف XSL التي سيتم استخدامها لعرض البيانات XML المحدثة. وهذه الورقة أسلوب لا يؤدي في شكل HTML للتحرير، ولكن الجدول 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>

عرض ملف XSL .


ملف ASP

شكل HTML في "tool.xsl" ملف فوق ديه سمة العمل مع قيمة "edittool.asp" .

و "edittool.asp" تحتوي الصفحة ظيفتين: و loadFile() الأحمال وظيفة وتحول ملف XML للعرض و updateFile() تنطبق ظيفة التغييرات إلى ملف 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: إذا كنت لا تعرف كيفية كتابة ASP، يرجى دراسة لنا ASP البرنامج التعليمي .


وPHP الملف

في "tool.xsl" ملف أعلاه، تغيير السمة الإجراء شكل HTML ل "edittool.php" .

و "edittool.php" تحتوي الصفحة ظيفتين: و loadFile() الأحمال وظيفة وتحول ملف XML للعرض و updateFile() تنطبق ظيفة التغييرات إلى ملف 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");
}
?>

نصيحة: إذا كنت لا تعرف كيفية كتابة PHP، يرجى دراسة لدينا PHP البرنامج التعليمي .

Note: نحن نقوم التحول وتطبيق التغييرات على ملف XML على الخادم. هذا هو الحل عبر متصفح. العميل سوف يحصل فقط HTML مرة أخرى من الخادم - والتي ستعمل في أي متصفح.