Совместимы ли классы и методы .NET 3.5 XPath с XSLT 2.0?

Я хотел бы использовать регулярные выражения при выборе элементов с помощью функции сопоставления. Я бы предпочел не использовать для этого внешнюю библиотеку (например, saxon).


person Community    schedule 18.09.2008    source источник


Ответы (6)


В XSLT 2.0 есть некоторые вещи, которые не поддерживаются встроенными библиотеками (в моно-списке рассылки было обсуждение этого вопроса, но я больше не могу найти информацию). Но большинство людей никогда не сталкиваются с крайними случаями, которые не поддерживаются.

Другой вариант - проверить открытый исходный код http://saxon.sourceforge.net/, который имеет отличную поддержку для 2.0.

РЕДАКТИРОВАТЬ (AB): принятый выше ответ может сбивать с толку. Нет никакой поддержки и нет планов в этом направлении для любая из функций XPath 2.0 или XSLT 2.0 в .NET.

person sontek    schedule 18.09.2008
comment
Я бы предпочел не использовать для этого внешнюю библиотеку (например, saxon). - person ; 18.09.2008
comment
угловые случаи? XSLT 2.0 - это полная переработка и очень широкое расширение спецификации 1.0. В настоящее время нет никакой поддержки какой-либо новой функциональности XSLT 2.0 или XPath 2.0 в .NET, и больше нет планов: stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-net - person Abel; 20.01.2010
comment
Я думаю, что у меня есть награда за это, которая автоматически выбирает ответ, получивший наибольшее количество голосов. С добавлением Авеля это теперь хороший выбор. - person ; 20.01.2010

Я считаю, что ответ в этой дискуссии вводит в заблуждение. Я думаю, что .NET 3.5 не поддерживает большинство функций XSL / T 2.0 (если они вообще есть).

Пример:

Вызов функции 2.0 дает следующее сообщение об ошибке в .NET 3.5:

current-dateTime () - неизвестная функция XSLT.

person E Zeelen    schedule 04.11.2009
comment
Вы совершенно правы. XSLT 2.0 вообще не поддерживается. Ответ действительно вводит в заблуждение. Я добавил примечание к этому ответу. - person Abel; 20.01.2010

Я думаю, что приведенный выше ответ неверен. Я не могу найти никаких доказательств того, что Microsoft поддерживает XSLT 2.0. XSLT! = XPath.

person Pete    schedule 03.10.2008
comment
Я думаю, что это ссылка на ответ: stackoverflow.com/questions/94047/ (от Nikki9696) - person Scott Dorman; 03.10.2008

Для справки в будущем вот хорошая страница о расширении 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.

Members.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>

Memberdisplay.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>        
person Community    schedule 04.12.2008
comment
+1 отличный пост и объяснение расширения XSLT 1.0 в .NET. - person Abel; 20.01.2010
comment
@abel, зайдите на сайт, на который я указал, и подарите им немного любви. Я украл у них все. - person ; 20.01.2010

Обсуждая поддержку .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 Data Model (XDM) (http://www.w3.org/TR/xpath-datamodel), который гласит:

[Определение: каждый экземпляр модели данных представляет собой последовательность.].

[Определение: последовательность - это упорядоченный набор из нуля или более элементов.] Последовательность не может быть членом последовательности. Одиночный элемент, появляющийся сам по себе, моделируется как последовательность, содержащая один элемент. Последовательности определены в 2.5 Последовательности.

[Определение: элемент является либо узлом, либо атомарным значением],

В случае XPath API - XPathNodeIterator - это последовательность, а XPathItem (XPathNavigator) представляет элемент.

person John Ingle    schedule 10.12.2009
comment
Отличный ответ, гораздо более правильный, чем реальный ответ ;-). Я искал официальный документ о поддержке (и использовании?) XDM, но не нашел. Может быть, Кадлучка знает кого-нибудь? - person Abel; 20.01.2010
comment
Г-н Кадлучка не рекомендовал ни одного такого документа. Я рекомендую связаться с командой Microsoft XML через их блог по адресу blogs.msdn.com/xmlteam, если у вас есть любые конкретные вопросы. - person John Ingle; 20.01.2010

Да, 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».

person Nikki9696    schedule 18.09.2008
comment
Тогда почему не распознается функция совпадений? - person ; 18.09.2008
comment
Я не знаю; это задокументировано. msdn.microsoft.com/en-us/ библиотека / - person Nikki9696; 26.09.2008
comment
XSLT - это не то же самое, что XPath или XQuery, поэтому он действительно не поддерживает XSLT 2.0 (есть несколько вещей, которые он выполняет, но не много). - person Scott Dorman; 03.10.2008
comment
@Scott: Боюсь, что здесь даже несколько вещей. Ни XPath 2.0, ни XSLT 2.0 не поддерживаются. Они объявили о реализации, но позже снова отозвали это. - person Abel; 20.01.2010