يمكن تحويل بيانات XML إلى HTML باستخدام ورقة أنماط XSL بسيطة. مع استمرار تطور مواصفات XML، يبدو أنه من الضروري تلبية احتياجات الجميع في الإصدارات الجديدة؛ ولسوء الحظ، فإن إجراء تحويلات بسيطة كان دائمًا ما يعاني منه المواصفات.
لنفترض أن لدي بيانات XML تمثل محتوى الصفحة، وأريد الآن تحويل محتواها إلى تخطيط. هذا هو ملف XML الذي أريد تحويله:
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="article.xsl"?>
<إكسمل>
<المجلدات>
<مجلد>
<text>المجلد 1</text>
<الملفات>
<ملف>
<text>الملف 1</text>
<الحقول>
<المجال>
<البيانات>
<نوع>سلسلة</نوع>
<الطول>50</الطول>
<value>بعض البيانات</value>
</البيانات>
</الحقل>
</الحقول>
</ملف>
</الملفات>
</مجلد>
</المجلدات>
</xml>
يمثل هذا المحتوى مجموعة من المجلدات والملفات والحقول. يحتوي كل مجلد على ملفات، ويحتوي كل ملف على حقول لإدخال البيانات. سيتم تمثيل كل مجلد في مجموعة المجلدات بعنصر TR وعنصر TD في الصف الأول من الجدول. سيتم تمثيل كل ملف في مجموعة الملفات كعنصر TR وعنصر TD في السطر الأول من عنصر TABLE المتداخل داخل عنصر المجلد TR. سيظهر كل مجال في مجموعة المجال كمدخل في الملف المرتبط.
لتنفيذ هذه الفكرة، نحتاج إلى اجتياز XML وإنشاء جدول يعتمد على XSL.
هذا هو XSL المستخدم لهذا التحويل:
<?xml version="1.0"?>
<xsl:ورقة الأنماط
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform " الإصدار = "1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fn=" http://www.mycompany.com/mynamespace ">
<xsl:output أسلوب = "html"/>
<msxsl:script language = "JScript" Implements-prefix = "fn">
وظيفة getElementCount(nodelist, What) {
فاررترن = 0;
rtrn =nodelist[0].parentNode.selectNodes(what).length;
return (rtrn + 1); //1 يضاف للحشو TD
}
</msxsl:script>
<xsl:template match="/">
<TABLE CELLSPACING="0" CELLPADDING="0"
العرض = "100%" الحدود = "0" المعرف = "tblRoot" NAME = "tblRoot"
نمط = "تخطيط الجدول: ثابت؛">
<TR>
<xsl:for-each حدد = "xml/folders/folder">
<xsl:اسم العنصر = "TD">
<xsl:attribute name="style">العرض:55px</xsl:attribute>
<xsl:قيمة التحديد = "نص"/>
</xsl:العنصر>
</xsl:لكل>
<TD> </TD>
</TR>
<xsl:for-each حدد = "xml/folders/folder">
<TR>
<xsl:اسم العنصر = "TD">
<xsl:اسم السمة = "colspan">
<xsl:value-of Select="fn:getElementCount(., 'folder')"/>
</xsl:السمة>
<تباعد خلايا الجدول="0" لوحة الخلية="0"
WIDTH = "100%" BORDER = "0" style = "تخطيط الجدول: ثابت؛">
<TR>
<xsl:for-each حدد = "files/file">
<xsl:اسم العنصر = "TD">
<xsl:attribute name="style">العرض:55px;</xsl:attribute>
<xsl:قيمة التحديد = "نص"/>
</xsl:العنصر>
</xsl:لكل>
<TD> </TD>
</TR>
<xsl:for-each حدد = "files/file">
<TR>
<xsl:اسم العنصر = "TD">
<xsl:اسم السمة = "colspan">
<xsl:value-of Select="fn:getElementCount(., 'file')"/>
</xsl:attribute>
<xsl:for-each حدد = "fields/field">
<xsl:element name="INPUT">
<xsl:attribute name="type">النص</xsl:attribute>
<xsl:اسم السمة = "maxlength">
<xsl:قيمة تحديد = "البيانات/الطول"/>
</xsl:السمة>
<xsl:اسم السمة = "القيمة">
<xsl:قيمة-من تحديد = "البيانات/القيمة"/>
</xsl:السمة>
</xsl:العنصر><BR/>
</xsl:for-each>
</xsl:element>
</TR>
</xsl:لكل>
</الجدول>
</xsl:العنصر>
</TR>
</xsl:لكل>
</TABLE>
</xsl:template>
</xsl:ورقة الأنماط>
في علامة ورقة الأنماط، قمنا بإعداد العديد من مساحات الأسماء، بما في ذلك مساحة الاسم xsl التي تحدد جميع علامات تحويل xsl. مساحة الاسم msxml التي تسمح لنا بإنشاء وظائف المستخدم التي يمكن استخدامها في أوراق الأنماط. أستخدم هذا للحصول على كافة العناصر الفرعية من أجل الحصول على سمة COLSPAN المحددة لعلامة TD. مساحة الاسم fn المستخدمة للانضمام إلى مجموعة من الوظائف المعرفة بواسطة المستخدم والتي تم إنشاؤها بواسطة عنصر msxml:script.
ثم نقوم بإنشاء الجدول الخارجي وأول TR. في TR، أقوم بإنشاء TD لكل مجلد محدد في XML. لقد استخدمت علامة xsl:element لأنها تسمح لي بإضافة سمات مخصصة أو تنفيذ وظيفة لتعيين خاصية لسمة COLSPAN في عنصر TD آخر.
بعد إنشاء TD المطلوب لكل مجلد، بدأت في إنشاء TR لكل مجلد. أقوم بإضافة TD واحد فقط إلى TR هذا، لكني قمت بتعيين سمة COLSPAN الخاصة به مساوية لعدد علامات المجلدات في مجموعة المجلدات بالإضافة إلى علامة واحدة. يتم استخدام الجزء الإضافي لملء الفراغات في جدول تخطيط ثابت.
للحصول على COLSPAN، أقوم بتمرير السياق الحالي (المحدد هنا بواسطة ".") واسم العقدة التي أريد حسابها. في وظيفتي، أحصل على السياق الحالي وparaentNode وعدد العقد المحددة في استعلام XPath. تقوم الدالة بعد ذلك بإرجاع هذا المبلغ بالإضافة إلى واحد لملء TD.
باستخدام TD هذا، قمت بتضمين جدول آخر يحتوي على كل ملف في مجموعة الملفات. من هذه النقطة فصاعدًا، ستكون العملية هي نفسها المتبعة في تحويل TABLE خارجي. الخطوة الأخيرة هي إضافة الحقول في كل ملف. هذه المرة لم أقم بإنشاء جدول مضمن، لقد قمت فقط بإضافة الحقول إلى TD الحالي.
بمجرد الانتهاء من التخطيط العام، يمكنني البدء في إضافة ميزات واجهة المستخدم، مثل إخفاء المجلدات وصفوف الملفات الأخرى حتى ينقر المستخدم على علامة التبويب ذات الصلة. يمكن تحقيق هذه الوظيفة عن طريق كتابة برنامج نصي يدعم هذه الوظيفة، وإضافة عنصر xsl:attribute عند النقر إلى عناصر TD للمجلد والملف، ثم تعيين قيمته على اسم وظيفة البرنامج النصي.
أخيرًا، بعد اكتمال الوظيفة العامة، يمكنك إضافة فئة xsl:attributes وإضافة أسماء الفئات ذات الصلة في STYLE أو CSS للحصول على الشكل الذي تريده.
يقوم هذا المثال بإنشاء أساس لعرض File-Folder-Field المستخدم في نشر حلول بيانات الويب. قم بزيارة MSDN لمعرفة المزيد حول مواصفات XML الخاصة بشركة Microsoft.