เอ็กเอ็มแอล (XML)
ความหมายของ XML

หากถามว่า XML คืออะไร ตอบสั้น ๆ ได้ว่า
XML คือ ภาษาสำหรับอธิบายข้อมูล และเก็บข้อมูลไปพร้อมกัน มีโครงสร้างคล้ายกับ HTML ซึ่งผู้สร้างข้อมูลกำหนด TAG เองได้ เช่น <WIFE> หรือ <Customer>
HTML คือ ภาษาสำหรับแสดงผลข้อมูล และแสดงข้อมูลอย่างไร ซึ่งมี TAG เป็นคำสั่งตายตัว เช่น <HTML> หรือ <IMG> เป็นต้น

XML (eXtensible Markup Language) คือ รูปแบบข้อมูลที่มีโครงสร้างที่เอื้อต่อการแลกเปลี่ยนข้อมูลในเครือข่ายอินเทอร์เน็ต ใช้รูปแบบที่ขยายจากภาษาเฮชทีเอ็มแอลสำหรับกำหนดวัตถุ เป็นมาตรฐานที่สอดคล้องตาม RFC 7303 ถูกพัฒนาขึ้นโดย W3C (World Wide Web Consortium) การตั้งชื่อ TAG สามารถใช้เครื่องหมาย dash(-) หรือ underscore(_) หรือ dot (.) หรือ colon (:) แต่ dash ใช้เป็นอักษรแรกของ TAG ไม่ได้

นิยามเป็นภาษาอังกฤษ XML (eXtensible Markup Language) is a data format for structured document interchange on the Web. It is a standard defined by The World Wide Web consortium (W3C). Information about XML and related technologies can be found at w3.org/XML

ข้อควรทราบ
  1. แฟ้ม XML (eXtensible Markup Language) คือ แฟ้มข้อมูลที่เก็บในเครื่องบริการ ที่เปิดให้นักพัฒนาเข้าไปคัดลอก หรืออ่านข้อมูลมาใช้ แบบ Readonly ด้วยภาษาใด ๆ ประมวลผล แล้วแสดงผลบน webpage ของผู้พัฒนาได้ พบตัวอย่างการเผยแพร่ข้อมูลของรัฐบาลในรูปแบบ XML ผ่าน data.go.th ที่นักพัฒนาสามารถนำข้อมูลมาใช้ได้ ซึ่งแฟ้มแบบ XML นี้ คล้ายกับแฟ้มแบบ .dbf, .mdb, .xlsx, .csv, .json หรือ .txt ซึ่งแฟ้ม .xml เป็นที่ยอมรับ และใช้กันแพร่หลาย โดยผู้ใช้สามารถเขียนโปรแกรมเข้าไปอ่านข้อมูลได้
  2. แฟ้ม XSL (eXtensible Stylesheet Language) คือ แฟ้มที่ใช้อธิบายว่าจะแสดง XML อย่างไร จะคล้ายกับ CSS
  3. แฟ้ม XSL หรือ XSLT (EXtensible Stylesheet Langauge Transformation) คือ การแปลง (Tranformation) เอกสารข้อมูลที่มีรูปแบบ XML ให้เป็นตามรูปแบบของ XSL แล้วนำเสนอข้อมูลตามรูปแบบที่กำหนด มักแปลงออกไปเป็นรูปแบบ HTML หรือ Plain Text ที่เข้าใจ และนำเสนอใน Webpage ได้ง่าย ?
  4. แฟ้ม HTML (Hyper Text Markup Language) คือ แฟ้มที่นำ xml และ xsl พาพบกันและแสดงผล
  5. แฟ้ม PHP (PHP Hypertext Preprocessor) คือ ภาษา Server-Sided Script เพื่อประมวลผลแฟ้ม XML ตามที่ต้องการ
    แนะนำเว็บไซต์
  1. http://www.xmlsoft.org/guidelines.html
  2. http://www.xml.org
  3. http://www.php.net/manual/en/ref.xml.php
  4. http://www.xml.com
  5. http://www.vcharkarn.com/include/article/
  6. http://www.maani.us/xml_charts/ .zip
  7. http://www.thaiall.com/vbnet/data_conn.htm ***
    ตัวอย่างแฟ้ม XML ที่ Online
  1. http://thaiall.com/xml/family.xml
  2. http://truehits.net/xml/education.xml
  3. http://www.aripfan.com/.. ../feed/
    สารบัญ
    Section 1 : How to write XML file
  1. Data file : employees.xml
    Source code : employees.xml
    :: แฟ้นนี้คือ แฟ้มข้อมูล ที่เปิดให้ load ไปใช้อย่างไรก็ได้ แต่เน้นไปในทาง readonly ผมได้สร้างแฟ้มนี้ และเขียนโปรแกรม list01.xsl, list01.htm, list02.xsl, list02.htm, list03sale.xsl, list03admin.xsl, list03.htm ซึ่งทั้งหมดทำงานในเครื่อง stand alone และใช้ IE5 ขึ้นไป เรียกข้อมูลมาแสดงได้ปกติ
    :: ประโยชน์ที่เห็นได้ชัดเจนของ XML คือ สามารถนำไปแสดงในระบบปฏิบัติ อุปกรณ์ หรือสื่อต่าง ๆ ได้โดยง่าย เพราะได้รับการยอมรับอย่างกว้างขวาง (ขนาดผมเองยังมีแผนนำเสนอข้อมูลทั้งหมด ที่เคยจัดเก็บในรูป xml) เพราะท่านสามารถเขียน xsl จัดรูปแบบข้อมูลใหม่ แต่เรียกข้อมูลจากเว็บของผม คล้ายตัวอย่าง educationt.xsl และ educationt.htm
    Section 2 : Using of XSL and HTM (Case 1)
  2. list01.xsl (ใช้ข้อมูลจาก employees.xml)
    Source code : employees.xml
    :: กำหนดรูปแบบ extensible stylesheet language เพื่อให้โปรแกรมอื่น ๆ เรียกไปใช้ และกำหนดรูปแบบได้ตามที่กำหนด ในที่นี้จะถูกเรียกใช้โดย list01.htm ผลที่ได้จะเป็นข้อมูลธรรมดาที่ไม่ถูกจัดเรียก และท่านสามารถทดสอบโปรแกรมเพื่อดูผลได้จาก list01.htm
  3. list01.htm (ใช้ข้อมูลจาก employees.xml)
    :: ทดสอบที่ [thaiall.com และ thcity.com]
    :: โปรแกรมนี้ใช้ java script ในการเรียกแฟ้มข้อมูล employees.xml และเรียกรูปแบบจาก list01.xsl มารวมกัน และให้ผลตามที่ต้องการในโปรแกรมตัวนี้
    Section 3 : Using of XSL and HTM (Case 2)
  4. list02.xsl (ใช้ข้อมูลจาก employees.xml)
  5. list02.htm (ใช้ข้อมูลจาก employees.xml)
    :: ทดสอบที่ [thaiall.com และ thcity.com]
    Section 4 : Using of XSL and HTM (Case 3)
  6. list03sale.xsl (ใช้ข้อมูลจาก employees.xml)
    :: เลือกเฉพาะข้อมูลที่มี department = sale
  7. list03admin.xsl (ใช้ข้อมูลจาก employees.xml)
    :: เลือกเฉพาะข้อมูลที่มี department = admin
  8. list03.htm (ใช้ข้อมูลจาก employees.xml)
    :: ทดสอบที่ [thaiall.com และ thcity.com]
    :: มีการใช้ความสามารถของ java script เพื่อส่งความต้องการจาก form ไปเลือก xsl ที่ต้องการ
    Section 5 : Using of XSL and HTM (Case 4)
  9. Data file : http://truehits.net/xml/education.xml
    :: คัดลอกแฟ้มนี้มาจาก truehits.net เมื่อวันที่ 3 กันยายน 2545
  10. education.xsl (ใช้ข้อมูลจาก education.xml)
  11. education.htm (ใช้ข้อมูลจาก education.xml)
    :: ทดสอบที่ [thaiall.com และ thcity.com]
  12. educationt.htm (ใช้ข้อมูลจาก http://truehits.net/xml/education.xml)
    :: ทดสอบตามปกติที่ thcity.com และ thaiall.com ไม่ได้ ถ้าให้ได้ จะต้องลด Security ของ Browser เป็น Low
    :: โปรแกรมนี้เรียกรูปแบบ(xsl) ใน server ของผม แต่ไปเรียกข้อมูลจากเจ้าของข้อมูลที่ http://truehits.net/xml/education.xml ท่านอาจประยุกต์ด้วยการ เขียน xsl และ htm ของตนเอง แต่เรียกข้อมูลที่แหล่งข้อมูลเปิดเผยให้ใช้ ในอนาคต ผมจะเริ่มนำข้อมูลมาให้ใช้ในแบบ xml บ้าง เช่นฐานข้อมูลเว็บของชาวไทย เป็นต้น และโปรแกรมนี้เองทำให้ผมดูผลการจัดอันดับของกลุ่มการศึกษา ของ truehits.net โดยไม่ต้องเข้าไปเปิดเว็บไซต์ของเขา
    :: ผมได้รับ e-mail จากคุณศุภกิจ pao@eng.kmitnb.ac.th ทำให้ทราบว่าตัวอย่างนี้ทดสอบแล้วมีปัญหาคืออ่าน xml จากข้างนอกเข้ามาไม่ได้ แต่ถ้าทดสอบกับเครื่องตนเองจะอ่าน xml จากที่ใดก็ได้ เมื่อผมทดสอบก็พบปัญหาเช่นกัน แต่พบวิธีแก้ไขคือแก้ option ใน IE เรื่อง security ให้เป็น Low ก็จะใช้ตัวอย่างที่ 12 นี้ได้ ที่ผมหาปัญหาพบ เพราะลองติดตั้ง PWS แล้วเรียกใช้ จะมีการถามเรื่องความปลอดภัยซึ่งหลักการนี้มีปัญหานะครับ หรือไม่ก็ต้องไปหา PHP ตามตัวอย่าง 15 ครับ สำหรับการลด security ผมมีภาพมาฝาก แสดงในส่วน source code ด้วย
    Section 6 : Using of XML and PHP
  13. structure.php (ใช้ข้อมูลจาก http://truehits.net/xml/education.xml หรือท่านกำหนดขึ้นเองได้)
    :: ทดสอบที่ [thcity.com] แต่ thaiall.com ใช้ structure.php แล้วอ่าน XML ไม่ได้ ปัญหาน่าจะมามาก server
  14. readxml.php (ใช้ข้อมูลจาก http://truehits.net/xml/education.xml หรือท่านกำหนดขึ้นเองได้)
    :: ทดสอบที่ [thcity.com] แต่ thaiall.com ใช้ readxml.php แล้วอ่าน XML ไม่ได้ ปัญหาน่าจะมามาก server
  15. xmldata.php (ใช้ข้อมูลจาก employees.xml หรือท่านกำหนดขึ้นเองได้)
    :: ทดสอบที่ [thcity.com] แต่ thaiall.com ใช้ xmldata.php แล้วอ่าน XML ไม่ได้ ปัญหาน่าจะมามาก server
    :: โปรแกรมนี้ถูกปรับปรุงให้สามารถอ่าน xml ได้โดยไม่ต้องทราบโครงสร้างของแฟ้มก่อน แต่อ่านมาแสดงผลในตารางได้ ได้ทดสอบกับหลาย ๆ แล้วของ xml แต่อาจมีปัญหากับบางแฟ้มที่มีโครงสร้างซับซ้อนได้ ... ต้องลองดูครับ
    Section 7 : javascript in HTML
  16. xmljavas.htm (ใช้ข้อมูลจาก dataj.xml หรือท่านกำหนดขึ้นเองได้)
    :: ทดสอบที่ [thaiall.com และ thcity.com] ผลการทดสอบมีปัญหาเรื่อง security ให้ดูจากข้อ 12
    :: แฟ้ม XML บางแฟ้มมีระเบียนเดียว โปรแกรม Javascript นี้จะอ่านข้อมูลทั้งหมดไปใช้ได้ โดยไม่คำนึงว่ามีกี่ระเบียน มักเป็นข้อมูลที่เก็บข้อกำหนดต่าง ๆ เพียงระเบียนเดียวเท่านั้น ถ้ามีหลายระเบียนก็จะใช้หลักการในหัวข้อต่อไป
  17. xmledu.htm (ใช้ข้อมูลจาก http://truehits.net/xml/education.xml)
    :: ทดสอบที่ [thaiall.com และ thcity.com] ผลการทดสอบมีปัญหาเรื่อง security ให้ดูจากข้อ 12
    :: แสดงการอ่านข้อมูลจากแฟ้ม http://truehits.net/xml/education.xml มาแสดงผลได้อย่างเหมาะสม โดยใช้ความสามารถของ javascript พร้อมแทรก html code เข้าไปในรายงานได้อย่างสวยงามเท่าที่ต้องการ
    Section 8 : Convert from CSV to XML
  18. crtxml.php (ทดสอบโปรแกรมที่ crtxml.php)
    :: ทดสอบที่ [thaiall.com และ thcity.com]
    :: โปรแกรมนี้ช่วยให้ท่านที่มีข้อมูลในแบบ CSV (Comma Separated Variable) สามารถสร้างแฟ้ม XML มาใช้งานได้โดยง่าย โดยกำหนดชื่อของ field ต่าง ๆ พร้อมกรอกข้อมูล หลังกดปุ่ม submit ก็จะได้แฟ้ม XML ท่านเพียงแต่ save as โดยเลือก type เป็น HTML only แล้ว ตั้งชื่อใหม่มีนามสกุลเป็น .XML ก็จะนำแฟ้มนี้ไปใช้เป็น XML file ได้ทันที
    :: หรือ Right click ด้วย mouse บนแฟ้มที่มีรูปแบบเป็น XML แล้ว จากนั้นเลือก View source แล้ว Save as เป็นแฟ้มที่มีสกุลเป็น XML เพื่อนำไปใช้ต่อไป
    Section 999 : แปลงข้อมูลที่มีอยู่เป็น XML
    โปรแกรมต่าง ๆ ยอมรับแฟ้ม XML มากขึ้น ทำให้การ convert ข้อมูลที่มีอยู่เป็น XML ทำได้ง่ายขึ้น
    ตัวอย่าง 1 : ใช้ MS Access 2000 convert จากตาราง ได้ แฟ้ม xml xsd xsl มาพร้อมกันเลย

    ตัวอย่าง 2 : ใช้ MS Excel 2002 จัดเก็บเป็นแฟ้มแบบ xml (Excel รุ่นนี้เปิด XML มาแก้ไขได้เลย)

    ตัวอย่าง 3 : ใช้ PHPMyAdmin ส่งข้อมูลใน MySQL ไปเป็นแฟ้ม xml (Mysql-front ก็ทำได้เช่นกัน)

1. Data file : employees.xml
<?xml version="1.0"?>
<employee>
<empl department="sale">
<emplid>45001</emplid>
<emplname>thanom</emplname>
<emplsalary>15000</emplsalary>
</empl>
<empl department="sale">
<emplid>45002</emplid>
<emplname>pikun</emplname>
<emplsalary>9999</emplsalary>
</empl>
<empl department="admin">
<emplid>45003</emplid>
<emplname>sombat</emplname>
<emplsalary>12500</emplsalary>
</empl>
</employee>

2. Source of : list01.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <xsl:for-each select="employee/empl">
  <xsl:value-of/><br/>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

3. Source of : list01.htm
<html><head>
<script language="javascript">
var xml,xsl,formatresult;
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("employees.xml");
xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("list01.xsl");
formatresult = xml.transformNode(xsl);
document.write(formatresult);
</script></head>
<body></body></html>

4. Source of : list02.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <xsl:for-each select="employee/empl">
    <xsl:value-of select="@department"/>,
    <xsl:value-of select="emplid"/>,
    <xsl:value-of select="emplname"/>,
    <xsl:value-of select="emplsalary"/><br/>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

5. Source of : list02.htm
<html><head>
<script language="javascript">
var xml,xsl,formatresult;
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("employees.xml");
xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("list02.xsl");
formatresult = xml.transformNode(xsl);
document.write(formatresult);
</script></head>
<body></body></html>

6. Source of : list03sale.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <xsl:for-each select="employee/empl">
    <xsl:if test="@department[.='sale']">
      <xsl:value-of select="@department"/>,
      <xsl:value-of select="emplid"/>,
      <xsl:value-of select="emplname"/>,
      <xsl:value-of select="emplsalary"/><br/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

7. Source of : list03admin.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <xsl:for-each select="employee/empl">
    <xsl:if test="@department[.='admin']">
      <xsl:value-of select="@department"/>
      <xsl:value-of select="emplid"/>,
      <xsl:value-of select="emplname"/>,
      <xsl:value-of select="emplsalary"/><br/>
    </xsl:if>	
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

8. Source of : list03.htm
<html><head>
<script language="javascript">
var xml,xsl;
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("employees.xml");
function changexsl(xslstyle) {
  alert(xslstyle);
  xsl = new ActiveXObject("Microsoft.XMLDOM");
  xsl.async = false;
  xsl.load(xslstyle);
  result.innerHTML = xml.transformNode(xsl);
}
function filter(position) {
  if (position == "sale") changexsl("list03sale.xsl");
  if (position == "admin") changexsl("list03admin.xsl");
}
</script></head>
<body>
<form method=post><select name="position">
<option value="sale">sale
<option value="admin">admin
</select>
<input type=button name=change value=select onclick="filter(position.value)">
</form>
<div id="result"></div>
</body></html>

9. Data file : http://truehits.net/xml/education.xml
<?xml version="1.0" encoding="windows-874"?>
<!DOCTYPE data [
        <!ELEMENT data (member*)>
        <!ATTLIST data
	date CDATA #IMPLIED
	category CDATA #IMPLIED>
	<!ELEMENT member (url, website, sort, uniqueip, uniquesession, pageviews)>
        <!ELEMENT url (#PCDATA)>
        <!ELEMENT website (#PCDATA)>
        <!ELEMENT sort (#PCDATA)>
        <!ELEMENT uniqueip (#PCDATA)>
        <!ELEMENT uniquesession (#PCDATA)>
        <!ELEMENT pageviews (#PCDATA)>
	]>
<data date="2/09/2002" category="การศึกษา">
<member>
<url>www.friends.co.th</url>
<website>Friends.co.th -  เพื่อนเก่า ทะเบียนรุ่น ทุกสถาบัน</website>
<sort>10</sort>
<uniqueip>14701</uniqueip>
<uniquesession>50974</uniquesession>
<pageviews>76436</pageviews>
</member>
<member>
<url>www.ru.ac.th</url>
<website>มหาวิทยาลัยรามคำแหง</website>
<sort>68</sort>
<uniqueip>3068</uniqueip>
<uniquesession>4698</uniquesession>
<pageviews>4976</pageviews>
</member>
<member>
<url>www.stou.ac.th</url>
<website>มหาวิทยาลัยสุโขทัยธรรมาธิราช</website>
<sort>74</sort>
<uniqueip>2905</uniqueip>
<uniquesession>8621</uniquesession>
<pageviews>13482</pageviews>
</member>
<member>
<url>www.thaiall.com</url>
<website>thaiall.com,สอบ,สอน,สืบค้น,บทความ,ภาพสวย,จัดอันดับ</website>
<sort>114</sort>
<uniqueip>1906</uniqueip>
<uniquesession>5054</uniquesession>
<pageviews>8201</pageviews>
</member>
<member>
<url>www.NetDesign.ac.th</url>
<website>NetDesign ศูนย์อบรมด้าน Web Design และ E-Commerce อันดับ1 ของเมืองไทย</website>
<sort>138</sort>
<uniqueip>1504</uniqueip>
<uniquesession>4614</uniquesession>
<pageviews>6769</pageviews>
</member>
<member>
<url>www.eduzones.com</url>
<website>ไอ เอ็ดดูเคชั่น โซน</website>
<sort>155</sort>
<uniqueip>1288</uniqueip>
<uniquesession>3763</uniquesession>
<pageviews>5687</pageviews>
</member>
<member>
<url>www.ibscenter.net</url>
<website>ไอบีเอส พอร์ทัลเว็บ = โลกใบใหม่ของวัยเรียน </website>
<sort>214</sort>
<uniqueip>851</uniqueip>
<uniquesession>2168</uniquesession>
<pageviews>3691</pageviews>
</member>
<member>
<url>www.sk.ac.th</url>
<website>โรงเรียนสวนกุหลาบวิทยาลัย </website>
<sort>232</sort>
<uniqueip>759</uniqueip>
<uniquesession>3803</uniquesession>
<pageviews>7035</pageviews>
</member>
<member>
<url>www.triamudom.net</url>
<website>โรงเรียนเตรียมอุดมศึกษา - เตรียมบอร์ด</website>
<sort>236</sort>
<uniqueip>747</uniqueip>
<uniquesession>1571</uniquesession>
<pageviews>2054</pageviews>
</member>
<member>
<url>158.108.36.62/SCRIPTS/KUCityWWW/KUCityWWW.exe/www</url>
<website>ชุมชน ม.เกษตร</website>
<sort>252</sort>
<uniqueip>686</uniqueip>
<uniquesession>4864</uniquesession>
<pageviews>7721</pageviews>
</member>
</data>

10. Source of : education.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <ol/>
  <xsl:for-each select="data/member">
    <li/><xsl:value-of select="url"/>
    <xsl:value-of select="website"/>
    <xsl:value-of select="sort"/>
    <xsl:value-of select="uniqueip"/>
    <xsl:value-of select="uniquesession"/>
    <xsl:value-of select="pageviews"/>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

11. Source of : education.htm
<html><head>
<script language="javascript">
var xml,xsl,formatresult;
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("education.xml");
xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("education.xsl");
formatresult = xml.transformNode(xsl);
document.write(formatresult);
</script></head>
<body></body></html>

12. Source of : educationt.htm
<html><head>
<script language="javascript">
var xml,xsl,formatresult;
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("http://truehits.net/xml/education.xml");
xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("http://lampang.thcity.com/xml/education.xsl");
formatresult = xml.transformNode(xsl);
document.write(formatresult);
</script></head>
<body></body></html>

13. Source of : structure.php
<form action='structure.php'>
<input name=file value="http://truehits.net/xml/education.xml" size=30>
<input type=submit value="Show structure of XML">
</form>
<?
if (strlen($file) < 4) { $file = "employees.xml"; }
$depth = array();
function startElement($parser, $name, $attrs) {
    global $depth;
    for ($i = 0; $i < $depth[$parser]; $i++) {
        print "  ";
    }
    print "$namen";
    $depth[$parser]++;
}
function endElement($parser, $name) {
    global $depth;
    $depth[$parser]--;
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>

14. Source of : readxml.php
<form action='readxml.php'>
<input name=file value="http://truehits.net/xml/education.xml" size=30>
<input type=submit value="Read XML file">
</form>
<?
if (strlen($file) < 4) { $file = "employees.xml"; }
function trustedFile($file) {
    // only trust local files owned by ourselves
    if (!eregi("^([a-z]+)://", $file)
        && fileowner($file) == getmyuid()) {
            return true;
    }
    return false;
}
function startElement($parser, $name, $attribs) {
    print "<font color="#0000cc">$name</font>";
    if (sizeof($attribs)) {
        while (list($k, $v) = each($attribs)) {
            print " <font color="#009900">$k</font>="<font
                   color="#990000">$v</font>"";
        }
    }
    print ">";
}
function endElement($parser, $name) {
    print "<font color=#0000cc>$name</font>";
}
function characterData($parser, $data) {
    $data = str_replace("&",'&',$data);
	print "$data";
}
function PIHandler($parser, $target, $data) {
    switch (strtolower($target)) {
        case "php":
            global $parser_file;
            // If the parsed document is "trusted", we say it is safe
            // to execute PHP code inside it.  If not, display the code
            // instead.
            if (trustedFile($parser_file[$parser])) {
                eval($data);
            } else {
                printf("Untrusted PHP code: <i>%s</i>", htmlspecialchars($data));
            }
            break;
    }
}
function defaultHandler($parser, $data) {
    if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
        printf('<font color="#aa00aa">%s</font>', htmlspecialchars($data));
    } else {
		printf('<font size="-1">%s</font>', htmlspecialchars($data));
    }
}
function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                  $publicId) {
    if ($systemId) {
        if (!list($parser, $fp) = new_xml_parser($systemId)) {
            printf("Could not open entity %s at %sn", $openEntityNames, $systemId);
            return false;
        }
        while ($data = fread($fp, 4096)) {
            if (!xml_parse($parser, $data, feof($fp))) {
                printf("XML error: %s at line %d while parsing entity %sn",
                       xml_error_string(xml_get_error_code($parser)),
                       xml_get_current_line_number($parser), $openEntityNames);
                xml_parser_free($parser);
                return false;
            }
        }
        xml_parser_free($parser);
        return true;
    }
    return false;
}
function new_xml_parser($file) {
    global $parser_file;
    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    xml_set_default_handler($xml_parser, "defaultHandler");
    xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
    if (!($fp = @fopen($file, "r"))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, "array");
    }
    $parser_file[$xml_parser] = $file;
    return array($xml_parser, $fp);
}
if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die("could not open XML input");
}
print "<pre>";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %dn",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
print "</pre>";
xml_parser_free($xml_parser);
?>
15. ตัวอย่างโปรแกรมอ่านข้อมูลจากแฟ้ม xml ภายนอก (xmldata.php)
แฟ้มที่อยู่ในรูปแบบ XML เริ่มเกี่ยวข้องกับชีวิตเราเพิ่มขึ้น เห็นตัวอย่างการเผยแพร่ที่รัฐบาล ทำเว็บไซต์เผยแพร่ข้อมูล ผ่าน data.go.th (ข้อมูลสุขภาพรายจังหวัด) มีชุดข้อมูลเมื่อสิงหาคม 2560 แล้วจำนวนกว่า 908 ชุดข้อมูล มีรูปแบบ XML จำนวน 77 ชุดข้อมูล หรือที่ truehits.net เผยแพร่สถิติ Top 10 ในแต่ละ category ก็เผยแพร่ผ่าน XML เช่นกัน ที่ truehits.net หรืออัตราแลกเปลี่ยน ที่เผยแพร่โดยธนาคารแห่งประเทศไทย ที่ bot.or.th นอกจากข้อมูลที่เราคุ้นเคย อาจแสดงเป็นตาราง (Table) แถว (Row) หรือคอลัม (Column) ปัจจุบันเริ่มมีข้อมูลแบบ JSON พบใน data.go.th เช่นกัน และเริ่มได้รับความนิยมไล่ตาม XML มาติดติด
ปล. ตัวอย่างนี้ lock ไว้ ให้อ่านเฉพาะแฟ้ม education.xml หรือ employee.xml นะครับ แต่ปรับแก้ได้
<?php
/*
Script_name : xmldata.php
Source_code : http://www.thaiall.com/xml/
Version 2.2560-08-21
###########################
Update Description
- ปรับให้ทำงานกับทั้ง education.xml ที่ได้จาก truehits.net และผ่าน url กับ entertain.xml
- ปรับให้ทำงานกับ employees.xml ที่สร้างขึ้นเอง http://www.thaiall.com/xml/employees.xml
- ทดสอบบน Xampp 3.2.2 เมื่อ 21 สิงหาคม 2560 สามารถใช้งานได้ทั้ง 3 กรณี
http://localhost/xmldata.php?file=education.xml (ข้อมูลจาก truehits.net)
http://localhost/xmldata.php?file=employees.xml (สร้างขึ้นมาเพื่อทดสอบ)
http://localhost/xmldata.php?file=http://truehits.net/xml/entertain.xml
########################### */
/* Section 1 : Configuration */
if(isset($_REQUEST["file"])) $file_name = $_REQUEST["file"];
if(!isset($file_name) || strlen($file_name) < 4) { $file_name = "employees.xml"; }
$total_column = 999;		# เก็บจำนวน column ใน endElement ที่กำหนด 999 เพราะรองแรกไม่รู้จำนวน แต่ต้องใช้
$cnt_working_col = 1;		# ใช้นับ column ในแต่ละระเบียน จึง reset
$count_record = 0;			# ใช้นับ record ทั้งหมด
$count_column = 0;			# ใช้นับจำนวน column ทั้งหมด
$last_field = null; 		# สำหรับตรวจ last field
$xml_name = array();
/* Section 2 : Main Process */

if (!in_array($file_name, array("education.xml", "employees.xml"))) {
	die("Filename : limited");
}
if (!(list($xml_parser, $handle) = new_xml_parser($file_name))) {
	die("Could not open XML file");
}
// while ($read_data = fread($handle, filesize($file_name))) { // filesize ใช้กับ fopen จาก url ไม่ได้
while ($read_data = fread($handle, 8192)) {	
	if (!xml_parse($xml_parser, $read_data, feof($handle))) {
		die(sprintf("XML error: %s at line %dn",
		xml_error_string(xml_get_error_code($xml_parser)),
		xml_get_current_line_number($xml_parser)));
	}
}
print_data();
xml_parser_free($xml_parser);
/* Section 3 : Function Stock */
function print_data () {
	global $count_column, $count_record, $data, $xml_name, $data_attribs;	
	echo "<pre>[ record: $count_record column: ". ($count_column - 2) ."] \n"; 
	// หากนับเฉพาะตัวข้อมูล ก็จะไม่นับ <employee> กับ  <empl> จึงลบจำนวน $count_column ออกไป 2 ก็จะเหลือ 3
	// ที่ข้อมูลแสดงมา 4 column เพราะนำ attribute department ของ <empl> มาแสดง
	if(isset($data_attribs[0])) {
		// ใช้กรณีมี attribs ตั้งแต่ column แรก มีตัวอย่างใน education.xml
		for($i=0;$i<=count($data_attribs);$i++) { 
			echo $data_attribs[0][$i] . "\n";	
		}
	}
	for ($i=1;$i<count($xml_name);$i++) { echo " [ $xml_name[$i] ] "; }
	echo "<br/>";
	for ($i=1;$i<=$count_record;$i++) {
		// ใช้กรณีมี attribs ใน column ที่คุมระเบียน หรือก่อนเข้า field
		if(isset($data_attribs[$i][0])) echo $data_attribs[$i][0]; else echo "null";
		echo " | "; // department
		for ($j=1;$j<$count_column;$j++) { 
			if(isset($data[$i][$j])) echo $data[$i][$j]. " : "; 
		}
		echo "\n";
	}
}
// เข้าฟังก์ชันนี้ เมื่อพบการเปิด <Tag ..> เปิดเท่าใดก็เรียกใช้เท่านั้น 
function startElement($parser, $name, $attribs) {
	global $count_column,$count_record,$xml_name,$last_field,$data_attribs,$total_column;
	if (isset($xml_name[0]) && (!isset($xml_name[1]) || $xml_name[1] == $name)) {
		$count_record++; // สำหรับนับ record
	}		
	if (count($attribs) > 0) { // ถ้ามี attribs ก็จะเก็บข้อมูลไว้เรียกใช้ภายหลัง
		$cnt_attribs = 0;
		foreach($attribs as $key => $value) { 
			$data_attribs[$count_record][$cnt_attribs++] = "$key:$value"; 	// department:sale
		}	
	}	
	if ($last_field == null ) {
		if(!in_array($name,$xml_name)) {
			$xml_name[$count_column] = $name;		
			$count_column = $count_column + 1; // สำหรับนับ column
		}
	}
	if (isset($xml_name[1]) && $xml_name[1] == $name && $count_column > $total_column) {
		$last_field = $name;
	}
}
// เข้าฟังก์ชันนี้ เมื่อพบการปิด </Tag> ปิดเท่าใดก็เรียกใช้เท่านั้น
function endElement($parser, $name) {
	global $xml_name,$cnt_working_col,$total_column;
	if ($name == $xml_name[1]) {
		$total_column = $cnt_working_col; // บันทึกจำนวน column ที่มากที่สุด คือ จำนวน column
		$cnt_working_col = 1; // บันทึกว่าปัจจุบันทำงาน columnn ที่เท่าใด เริ่ม reset ใหม่เมื่อปิด Tag
	}
}
// เข้าฟังก์ชันนี้ หลังเปิด หรือหลังปิด Tag แต่หยุดเข้าหลังปิด Tag ตัวสุดท้าย
function characterData($parser, $read_data) {
	global $data,$count_record,$cnt_working_col;
	if (strlen($read_data) > 1) {
		$data[$count_record][$cnt_working_col++] = $read_data;
	}
}
function new_xml_parser($file_name) {
	global $parser_file;
	$xml_parser = xml_parser_create(); // ผู้แยกคำ = parser
	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
	xml_set_element_handler($xml_parser, "startElement", "endElement");
	xml_set_character_data_handler($xml_parser, "characterData");
	if (!($handle = @fopen($file_name, "r"))) { return false; }
	if (!is_array($parser_file)) { settype($parser_file, "array"); }
	$parser_file[$xml_parser] = $file_name;
	return array($xml_parser, $handle);	
}
?>
16. Source of : xmljavas.htmตัวอย่างแฟ้ม dataj.xml
<?xml version="1.0"?>
<information>
<fld1>burin rujjanapan</fld1>
<fld2>Tel. 0-1992-7223</fld2>
<fld3>M</fld3>
</information>
<body>
แสดงการอ่านข้อมูลจาก xmljava<br>
<script language="JavaScript">
var xmlDoc;
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("dataj.xml");
var objNode;
objNode = xmlDoc.documentElement.childNodes;
for (i=0;i<objNode.length;i++)
document.write(objNode.item(i).firstChild.nodeValue+"<br>");
</script>
</body>

17. Source of : xmledu.htm
<body>
<script language="JavaScript">
var xmlDoc;
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("http://truehits.net/xml/education.xml");
var objNode;
objNode = xmlDoc.documentElement.childNodes;
for (i=0;i<objNode.length;i++)  {
  document.write("<b>"+ objNode.item(i).firstChild.nodeName + "</b> = " +
  objNode.item(i).firstChild.text+" | "+
  "<b>"+ objNode.item(i).firstChild.nextSibling.nodeName + "</b> = "+
  objNode.item(i).firstChild.nextSibling.text+" | "+
  "<b>"+ objNode.item(i).firstChild.nextSibling.nextSibling.nodeName+"</b>="+
  objNode.item(i).firstChild.nextSibling.nextSibling.text+" | "+
  "<b>"+ objNode.item(i).lastChild.nodeName + "</b> = " +
  objNode.item(i).lastChild.text + " | " + "<br>";
}
</script>
</body>

18. Source of : crtxml.php
<?
if (!isset($_POST['file0'])) {
  print "<body><pre><form action=crtxml.php method=post>
  File0 :: <input name=file0 value=filex> Rec0 :: <input name=rec0 value=recx>
  Fld1 :: <input name=fld1 value=id> Fld2 :: <input name=fld2 value=name> 
  Fld3 :: <input name=fld3 value=salary>
  Fld4 :: <input name=fld4> Fld5 :: <input name=fld5> Fld6 :: <input name=fld6>
  Fld7 :: <input name=fld7> Fld8 :: <input name=fld8> Fld9 :: <input name=fld9>
  <textarea name=data rows=10 cols=80>
  101,สมปอง,5000
  102,บุรินทร์,25000
  103,ศิรา,12000
  </textarea>
  <input type=submit value=create_XML></form>";
} else {
  print '<?xml version="1.0" encoding="windows-874"?>';
  print "\n<" . $_POST['file0'] . ">\n";
  $getline = preg_split("/[sn]+/",$_POST['data']);
  for ($j=0;$j<count($getline)-1;$j++) {
    if (strlen($getline[$j]) > 0) {
      print "<". $_POST['rec0'] . ">\n";
      $rec = preg_split("/[s,]+/",$getline[$j]);
      for ($k=0;$k<count($rec)-1;$k++) {
        print "<". $_POST['fld'. ($k + 1)]. ">$rec[$k]</". $_POST['fld'. ($k + 1)]. ">\n";
      }
      print "</" . $_POST['rec0'] . ">\n";
    }
  }
  print "</". $_POST['file0'] . ">";
}
?>
ใน Android Studio
เคยทดสอบการใช้ String-array ในบทความตอนที่ 7 เกี่ยวกับการพัฒนาแอพบนแอนดรอย
มีตัวอย่างข้อมูลในแฟ้ม strings.xml เป็นดังนี้

บทความที่ 611 …
บทความที่ 610 …
บทความที่ 609 …

หากเรียกใช้ใน activity เป็นดังนี้
Resources res = getResources();
String[] mData = res.getStringArray(R.array.data);
textView1.setText(mData[0]);
textView2.setText(mData[1]);
textView3.setText(mData[2]);
http://www.thaiall.com/blog/burin/8660/
แฟ้มแบบ xml สามารถเขียนโปรแกรมภาษา PHP จัดการได้
มีตัวอย่างที่ http://www.thaiall.com/xml
หากต้องการแฟ้มในรูปแบบ xml สามารถใช้โปรแกรม excel
https://msdn.microsoft.com/en-us/library/office/gg469857(v=office.14).aspx
http://www.excel-easy.com/examples/xml.html

ขั้นตอนมีดังนี้
1. บน Excel 2016 ใน Office 365
Right click บน Ribbon Menu แล้วมองหา Customize the Ribbon...
ในหน้าต่างทางขวาสุดจะพบชื่อ Tab ถูก Check ไว้หมด ยกเว้น Developer ก็คลิ๊กซะ
จากนั้นจะพบ Tab นี้อยู่ต่อท้าย Tab:View

2. ใช้ notepad สร้าง schema.xml หรือโครงสร้างข้อมูลแบบ XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item>sample data in first record</item>
<item>sample data in second record</item>
</data-set>
ต้องสร้างตัวอย่าง item 2 record ตอนทดสอบสร้าง  1 record แล้วจะรู้จักเพียง record เดียว
http://www.excel-easy.com/examples/xml.html (XMLSchema-instance)

3.  ใน Excel ยังไม่มีข้อมูล
คลิ๊กที่ Tab:Developer แล้ว Import, schema.xml ข้างต้น
เลือกวางที่ Sheet1!$A$1 จะพบข้อมูล มี item เป็น header ตามด้วข้อมูลในแถวที่ 2 และ 3
ต่อจากนี้ Click Source ใน Tab:Developer จะพบโครงสร้างของ schema

4. กรอกข้อมูลทับ เริ่มต้นแถวที่ 2
แถวที่ 2 ว่า cat แถวที่ 3 ว่า rat แล้วเพิ่มแถวที่ 4 ว่า dog แถวที่ 5 ว่า hen

5. save as เป็นแฟ้มแบบ XML data จะได้แฟ้ม data.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<item>cat</item>
	<item>rat</item>
	<item>dog</item>
	<item>hen</item>
</data-set>

6. ตัวอย่างจาก
https://support.office.com/en-us/article/Map-XML-elements-to-cells-in-an-XML-Map-ddb23edf-f5c5-4fbf-b736-b3bf977a0c53
แฟ้ม expenses.xml ไม่มี schema ภายนอก แต่เปิดด้วย excel แล้ว
excel สามารถอ่านโครงสร้าง แล้วสร้าง schema ให้อัตโนมัติ
แต่ไม่มี schema ทำให้ save as กลับไปเป็น .xml ไม่ได้
เมื่อ verify map for export พบว่า Denormalized data
แม้ใช้การ import แล้วลาก header ไปวาง ก็ยังไม่ผ่าน
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Root>
  <EmployeeInfo>
    <Name>Jane Winston</Name>
    <Date>2001-01-01</Date>
    <Code>0001</Code>
  </EmployeeInfo>
  <ExpenseItem>
    <Date>2001-01-01</Date>
    <Description>Airfare</Description>
    <Amount>500.34</Amount>
  </ExpenseItem>
  <ExpenseItem>
    <Date>2001-01-01</Date>
    <Description>Hotel</Description>
    <Amount>200</Amount>
  </ExpenseItem>
</Root>

7. ตัวอย่างจาก 
https://support.office.com/en-us/article/Map-XML-elements-to-cells-in-an-XML-Map-ddb23edf-f5c5-4fbf-b736-b3bf977a0c53
แฟ้ม expenses.xsd มีโครงสร้าง
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" maxOccurs="1" name="EmployeeInfo">
          <xsd:complexType>
            <xsd:all>
              <xsd:element minOccurs="0" maxOccurs="1" name="Name" />
              <xsd:element minOccurs="0" maxOccurs="1" name="Date" />
              <xsd:element minOccurs="0" maxOccurs="1" name="Code" />
            </xsd:all>
          </xsd:complexType>
        </xsd:element>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="ExpenseItem">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Date" type="xsd:date"/>
              <xsd:element name="Description" type="xsd:string"/>
              <xsd:element name="Amount" type="xsd:decimal" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
ถ้า import schema ก่อน แล้วนำ header ไปวาง
ถึงจุดนี้ verify map for export พบว่า Root_map is exportable
แล้วพิมพ์ข้อมูลตาม column ก็ไม่มีปัญหา
หรือคัดลอกข้อมูลมาวางตาม header อย่างถูกต้องก็ทำได้
จะทำให้ save as เป็นแฟ้มแบบ xml ได้
การกรอกข้อมูลต้องกรอกแบบ Normalize ไม่ใช่กรอกแบบ Excel

8. ตัวอย่างจาก ข้อมูลหน่วยงานบริการสุขภาพจังหวัดแพร่
https://data.go.th/DatasetDetail.aspx?id=9fafcf88-13dd-4b87-a235-1ab553f148ca
นำเข้า excel โดยไม่ต้องมี schema
เมื่อ save as เป็นแบบ xml ออกไป ก็ไม่พบปัญหา
มีการทำงานแบบ XMLSchema-instance คือ อ่านจากโครงสร้างมาทำ Schema ได้เลย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<healthoffice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<record>
		<code>635300</code>
		<name>โรงพยาบาลส่งเสริมสุขภาพตำบลบ้านศรีภูมิ ตำบลแม่คำมี</name>
		<deptcode>
			<code>21002</code>
			<name>กระทรวงสาธารณสุข สำนักงานปลัดกระทรวงสาธารณสุข</name>
		</deptcode>
		<typecode>
			<code>18</code>
			<name>โรงพยาบาลส่งเสริมสุขภาพตำบล</name>
		</typecode>
		<level_hospital_id/>
		<bed>0</bed>
		<hos_size>ไม่ข้อมูล</hos_size>
		<areacode>
			<code>54011404</code>
			<provincecode>54</provincecode>
			<province>แพร่</province>
			<amphurcode>1</amphurcode>
			<amphur>เมืองแพร่</amphur>
			<tamboncode>14</tamboncode>
			<tambon>แม่คำมี</tambon>
			<moo>4</moo>
		</areacode>
		<status>
			<code>1</code>
			<name>เปิดดำเนินการ</name>
		</status>
		<servicelevel>
			<code>10</code>
			<name>1 ปฐมภูมิ</name>
		</servicelevel>
		<servicetype/>
		<update/>
		<code5>6353</code5>
	</record>
</healthoffice>

9. แฟ้มนี้นำเข้า excel กรอกข้อมูล record ต่อไป แล้ว save as เป็น XMl ได้เลย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<record>
		<field1>60-001</field1>
		<field2>Tom</field2>
	</record>
	<record>
		<field1>60-002</field1>
		<field2>Boy</field2>
	</record>
</rootdata>

10. แฟ้มนี้นำเข้า excel กรอกข้อมูล record ต่อไป แล้ว save as เป็น XMl ได้เลย
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<record>Tom</record>
	<record>Boy</record>
</rootdata>

11. ???

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" version="1.0">
<!-- xmlns:xsl="http://www.w3.org/1999/XSL/Transform" firefox56:ok, ie11:fail -->
<!-- xmlns:xsl="http://www.w3.org/TR/WD-xsl" firefox56:fail, ie11:ok -->
<xsl:template match="/">
	<xsl:for-each select="employee/empl">
		<xsl:value-of/> 
		
		<!-- 
		firefox56:fail, ie11:ok 
		<xsl:value-of/>
		-->
		
		<!-- 
		firefox56:ok, ie11:fail 
		<xsl:value-of select="emplid" />
		<xsl:value-of select="emplname" />
		<xsl:value-of select="emplsalary" /><br/>
		-->
	</xsl:for-each>
</xsl:template>  
</xsl:stylesheet>



http://goo.gl/72BPC