با سلام خدمت کاربران گرامی سایت پی وی لرن و علاقمندان و کاربرانی که علاقمند به یادگیری دوره XML هستند. در دو جلسه گذشته به کاربرد XSLT در سمت سرور و سمت کلاینت پرداختیم. در ادامه این دوره آموزش ویرایش XML را به علاقمندان این دوره ارائه می نماییم.
اطلاعات ذخیره شده در فایل های XML را می توان از یک مرورگر اینترنت ویرایش کرد.
اکنون نشان خواهیم داد که چگونه فایل XML را که در سرور ذخیره ذخیره شده است باز کنید؛ سپس آن را ویرایش کرده و مجدداً ذخیره نمایید.
ما از XSL را برای تبدیل سند XML به یک فرم HTML استفاده خواهیم کرد.
مقادیر عناصر XML به فیلدهای ورودی HTML در یک فرم HTML نوشته می شود.
این فرم HTML قابل ویرایش است.
پس از ویرایش داده ها، داده ها دوباره به سرور ارسال می شوند و فایل XML به روز می شود ( بعد از انجام این مراحل کد را برای هر دو PHP و ASP نمایش خواهیم داد).
ابتدا نگاهی به سند XML یعنی (“tool.xml”) می اندازیم:
1 2 3 4 5 6 7 8 9 10 11 12 | <?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> |
سپس به زیر یعنی (“tool.xsl”) توجه نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?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 بالای حلقه ها loops از طریق عناصر در فایل XML ایجاد می شوند و یک فیلد ورودی نیز برای هر عنصر “field” XML ساخته می شود.
مقدار عنصر “id” عنصر “field” XML به هر دو ویژگی “id” و “name” هر فیلد ورودی HTML افزوده می شود.
سپس ارزش هر عنصر “XML” value به عنصر “value” هر فیلد ورودی HTML افزوده می گردد.
نتیجه یک فرم HTML قابل ویرایش است که حاوی مقادیری از فایل XML می باشد.
حالا ما دومین style sheet را داریم:
“tool_updated.xsl”
این فایل در واقع فایل XSL است که برای نمایش داده های به روز شده XML استفاده می شود.
این style sheet به عنوان نتیجه در فرم HTML قادر به ویرایش شدن نیست اما می تواند یک HTML table استاتیک باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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> |
در فایل “tool.xsl” بالا، action attribute را از فرم HTML تغییر به “edittool.php” تغییر دهید.
صفحه edittool.php شامل دو تابع است: تابع ()loadFile بارگذاری و تبدیل فایل XML برای نمایش و تابع ()updateFile تغییرات در فایل XML را اعمال می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?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 در پی وی لرن بزنید!
ما در حال تغییر و تغییرات در فایل XML روی سرور هستیم. که راه حل cross-browser است و در جلسه پیش به آن اشاره شد.
کلاینت یا کاربر فقط HTML را از سرور دریافت می کند که البته در هر مرورگری کار می کند.
فرم HTML در فایل «tool.xsl» بالا یک action attribute را با مقدار «edittool.asp» همراه هم دارد.
صفحه edittool.asp حاوی دو تابع است: تابع ()loadFile بارگذاری و تبدیل فایل XML برای نمایش و تابع ()updateFile تغییرات در فایل XML را اعمال می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <% 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 %> |
در این جلسه با آموزش ویرایش XML آشنا شدید.
این جلسه پایانی بر فصل آموزش XSLT بود که به علاقمندان این دوره ارائه گردید.
در جلسه آینده فصل جدیدی در XML را ارائه می نماییم و به آموزش XQuery خواهیم پرداخت.
با پی وی لرن همراه باشید.