سؤال

أرغب في استخدام التعبيرات العادية في تحديد العناصر باستخدام وظيفة المطابقة.أفضل عدم استخدام مكتبة خارجية (مثل الساكسونية) للقيام بذلك.

هل كانت مفيدة؟

المحلول

هناك بعض الأشياء في XSLT 2.0 غير مدعومة في المكتبات المضمنة (كانت هناك مناقشة في القائمة البريدية الأحادية حول هذا ولكن لم يعد بإمكاني العثور على المعلومات بعد الآن).لكن معظم الأشخاص لا يواجهون أبدًا حالات زاوية غير مدعومة.

خيار آخر هو التحقق من المصدر المفتوح http://saxon.sourceforge.net/ الذي يتمتع بدعم كبير لـ 2.0.

تحرير (أ ب):قد تكون الإجابة المقبولة أعلاه مربكة.لا يوجد دعم على الإطلاق، وهناك ولا توجد خطط في هذا الاتجاه لأي من وظائف XPath 2.0 أو XSLT 2.0 في .NET.

نصائح أخرى

أعتقد أن الإجابة في هذه المناقشة مضللة.أعتقد أن .NET 3.5 لا يدعم معظم وظائف XSL/T 2.0 (إن وجدت على الإطلاق).

مثال:

يؤدي استدعاء دالة 2.0 إلى ظهور رسالة الخطأ التالية ضمن .NET 3.5:

"current-dateTime()" هي دالة XSLT غير معروفة.

أعتقد أن الإجابة أعلاه خاطئة.لا يمكنني العثور على أي دليل على أن Microsoft تدعم XSLT 2.0.XSLT != XPath.

للرجوع إليها مستقبلاً، إليك صفحة لطيفة حول توسيع xpath/xquery في .net:

http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=64

لا أثق في أن هذا سيستمر، لذا أنسخه هنا:


XSLT هي لغة تحويل لـ XML.يسمح لأنظمة الخادم بتحويل شجرة XML المصدر إلى نموذج أكثر ملاءمة للعملاء.يستخدم XSLT أنماط العقدة للمطابقة مع القوالب لإجراء تحويلاتها.على الرغم من أنه يجعل التحويلات المعقدة بسيطة نسبيًا، إلا أن هناك بعض المواقف التي قد نضطر فيها إلى استخدام بعض الفئات المخصصة.

بعض المواقف التي قد نحتاج فيها إلى تمديد XSLT هي:

1) استدعاء منطق الأعمال المخصص
2) تنفيذ إجراءات مختلفة حسب الأذونات
3) إجراء تنسيق معقد للتواريخ والسلاسل وما إلى ذلك
4) أو حتى الاتصال بخدمة ويب!!

خطوات تمديد XSLT

1) قم بإنشاء كائن مخصص لاستخدامه من داخل XSLT (في C #)

CustomDate custDate = new CustomDate() ;

2) توفير إعلان مساحة اسم مخصص للفئة المخصصة ضمن إعلان مساحة اسم XSLT (في ملف XSLT)

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

3) قم بتمرير مثيل للكائن المخصص إلى XSLT، بنفس مساحة الاسم كما في الخطوة الأخيرة (في C#)

xslArgs.AddExtensionObject("urn:custDate", custDate) ;

4) استخدم الكائن من داخل XSLT (في ملف XSLT)

<xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/>

عينة من الرموز

على سبيل المثال، لنفترض أن لدينا ورقة XSLT حيث نحتاج إلى معالجة التواريخ.نحتاج إلى إظهار عدد الأيام التي قضاها الموظف في الشركة.نظرًا لأن XSLT لا يحتوي على وظائف معالجة التاريخ الأصلية، فلنستخدم كائن ملحق لمهمتنا.

using System ;
using System.IO ;
using System.Xml ;
using System.Xml.Xsl ;
using System.Xml.XPath ;

public class XsltExtension{

    public static void Main(string[] args){

        if (args.Length == 2){

            Transform(args[0], args[1]) ;

        }else{

            PrintUsage() ;

        }
    }

    public static void Transform(string sXmlPath, string sXslPath){

        try{

            //load the Xml doc
            XPathDocument myXPathDoc = new XPathDocument(sXmlPath) ;

            XslTransform myXslTrans = new XslTransform() ;

            //load the Xsl 
            myXslTrans.Load(sXslPath) ;

            XsltArgumentList xslArgs = new XsltArgumentList() ;

            //create custom object
            CustomDate custDate = new CustomDate() ;

            //pass an instance of the custom object
            xslArgs.AddExtensionObject("urn:custDate", custDate) ;

            //create the output stream
            XmlTextWriter myWriter = new XmlTextWriter("extendXSLT.html", null) ;

            //pass the args,do the actual transform of Xml
            myXslTrans.Transform(myXPathDoc,xslArgs, myWriter) ;        

            myWriter.Close() ;

        }catch(Exception e){

            Console.WriteLine("Exception: {0}", e.ToString());
        }

    }

    public static void PrintUsage(){
        Console.WriteLine("Usage: XsltExtension.exe <xml path> >xsl path<") ;
    }

}

//our custom class
public class CustomDate{

    //function that gets called from XSLT
    public string GetDateDiff(string xslDate){

        DateTime dtDOB = DateTime.Parse(xslDate) ;

        DateTime dtNow = DateTime.Today ;

        TimeSpan tsAge = dtNow.Subtract(dtDOB) ;

        return tsAge.Days.ToString() ;
    }

}

قم بتجميع هذا الرمز واستخدم members.xml و memberdisplay.xsl المتوفرين لتشغيل تطبيق وحدة التحكم هذا.من المفترض أن تشاهد ملف ExtendXSLT.html داخل نفس المجلد.افتح هذا الملف ولاحظ أنه تم استدعاء فصلنا CustomDate لحساب عدد الأيام التي قضاها الموظف في الشركة.

ملخص :
XSLT هي لغة تحويل قوية لـ XML، ومع ذلك، فإن استخدام كائنات الامتداد في .NET وC# يجب أن يضمن أننا نستطيع بسهولة إنجاز ما قد يكون مستحيلًا أو صعبًا باستخدام XSLT وحده.

الأعضاء.xml:

 <root>
    <member>
        <name>Employee1</name>
        <joiningdate>01/01/1970</joiningdate>
        <role>CTO</role>
    </member>
    <member>
        <name>Employee2</name>
        <joiningdate>24/07/1978</joiningdate>
        <role>Web Developer</role>
    </member>
    <member>
        <name>Employee3</name>
        <joiningdate>15/12/1980</joiningdate>
        <role>Tester</role>
    </member>
</root>

عرض الأعضاء.xsl:

<xsl:transform
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:myCustDate="urn:custDate">

<xsl:output method="html" omit-xml-declaration="yes" />     

    <xsl:template match="/">
        <html>
            <head>
                <style>
                    TABLE.tblMaster
                    {
                        border-style: solid; 
                        border-width: 1px 1px 1px 1px; 
                        border-style: solid; 
                        border-color:  #99CCCC; 
                        padding: 4px 6px; 
                        text-align: left; 
                        font-family:Tahoma,Arial;
                        font-size:9pt;

                    }
                    TD.tdHeader
                    {
                        FONT-WEIGHT: bolder;
                        FONT-FAMILY: Arial;
                        BACKGROUND-COLOR: lightgrey;
                        TEXT-ALIGN: center
                    }
                </style>
            </head>
            <body>
                <table width="50%" class="tblMaster">
                    <tr >
                        <td class="tdHeader">Employee</td>
                        <td class="tdHeader">Join date</td>
                        <td class="tdHeader">Days in company</td>
                        <td class="tdHeader">Role</td>
                    </tr>
                    <xsl:for-each select="/root/member">

                        <tr >
                            <td> <xsl:value-of select="./name"/> </td>

                            <td> <xsl:value-of select="./joiningdate"/> </td>

                            <td> <xsl:value-of select="myCustDate:GetDateDiff(./joiningdate)"/> </td>

                            <td> <xsl:value-of select="./role"/> </td>
                        </tr>   

                    </xsl:for-each>

                </table>
            </body>
        </html>
    </xsl:template>

</xsl:transform>        

عند مناقشة دعم .NET لـ XSLT 2.0 وXPath 2.0 وXQuery 1.0، فمن المهم التمييز بين اللغات نفسها ونموذج البيانات (XDM).يدعم .NET 3.5 Framework نموذج البيانات، ولكن ليس اللغات.كما أوضح لي مؤخرًا عبر مراسلات البريد الإلكتروني بواسطة باول كادلوكزكا من Microsoft:

قد تكون جملة "مثيلات نموذج بيانات Xquery 1.0 و XPath 2.0" مربكًا ، لكنني أعتقد أنها تشير إلى مواصفات بيانات W3C Xquery 1.0 و XPath 2.0 (XDM) (http://www.w3.org/TR/xpath-datamodel) الذي يقرأ:

[تعريف:كل مثيل من نموذج البيانات هو تسلسل.].

[تعريف:التسلسل عبارة عن مجموعة مرتبة من عناصر صفر أو أكثر.] لا يمكن أن يكون التسلسل عضوًا في تسلسل.تم تصميم عنصر واحد يظهر من تلقاء نفسه كتسلسل يحتوي على عنصر واحد.يتم تعريف التسلسلات في 2.5 تسلسل.

[تعريف:العنصر هو إما عقدة أو قيمة ذرية] ،

في حالة XPath API - XPathNodeIritator هو التسلسل بينما تمثل XPathItem (xPathNavigator) العنصر.

نعم، الإصدار 3.5 من XPathNavigator يدعم XSLT 2.0.

http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx

"فئة XPathNavigator في مساحة الاسم System.Xml.XPath هي فئة مجردة تحدد نموذج المؤشر للتنقل وتحرير عناصر معلومات XML كمثيلات لنموذج بيانات XQuery 1.0 وXPath 2.0."

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top