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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
6 477
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Тогда почему не распознается функция совпадений?

user1228 18.09.2008 21:20

Я не знаю; это задокументировано. msdn.microsoft.com/en-us/library/…

Nikki9696 26.09.2008 00:20

XSLT - это не то же самое, что XPath или XQuery, поэтому он действительно не поддерживает XSLT 2.0 (есть несколько вещей, которые он выполняет, но не много).

Scott Dorman 03.10.2008 22:57

@Scott: Боюсь, здесь нет даже "нескольких вещей". Ни XPath 2.0, ни XSLT 2.0 не поддерживаются. Они объявили о реализации, но позже снова отозвали это.

Abel 20.01.2010 18:33
Ответ принят как подходящий

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

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

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

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

user1228 18.09.2008 20:50

угловые случаи? XSLT 2.0 - это полная переработка и очень широкое расширение спецификации 1.0. В настоящее время нет никакой поддержки каких-либо новых функций XSLT 2.0 или XPath 2.0 в .NET, и больше нет планов: stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-n‌ et

Abel 20.01.2010 18:27

Я думаю, что у меня есть награда за это, которая автоматически выбирает ответ, получивший наибольшее количество голосов. С добавлением Авеля это теперь хороший выбор.

user1228 20.01.2010 19:07

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

Я думаю, что это ссылки: stackoverflow.com/questions/94047/… (автор Nikki9696)

Scott Dorman 03.10.2008 22:56

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

+1 отличный пост и объяснение расширения XSLT 1.0 в .NET.

Abel 20.01.2010 18:32

@abel, зайдите на сайт, на который я указал, и подарите им немного любви. Я украл у них все.

user1228 20.01.2010 19:04

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

Пример:

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

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

Вы совершенно правы. XSLT 2.0 вообще не поддерживается. Ответ действительно вводит в заблуждение. Я добавил примечание к этому ответу.

Abel 20.01.2010 18:29

Обсуждая поддержку .NET для XSLT 2.0, XPath 2.0 и XQuery 1.0, важно различать сами языки и модель данных (XDM). .NET 3.5 Framework поддерживает модель данных, но не языки. Как мне недавно объяснил в электронной переписке Павел Кадлучка из Microsoft:

The sentence "instances of the XQuery 1.0 and XPath 2.0 Data Model" may be confusing but I believe it refers to W3C XQuery 1.0 and XPath 2.0 Data Model (XDM) spec (http://www.w3.org/TR/xpath-datamodel) that reads:

[Definition: Every instance of the data model is a sequence.].

[Definition: A sequence is an ordered collection of zero or more items.] A sequence cannot be a member of a sequence. A single item appearing on its own is modeled as a sequence containing one item. Sequences are defined in 2.5 Sequences.

[Definition: An item is either a node or an atomic value],

In the case of XPath API - XPathNodeIterator is the sequence while XPathItem (XPathNavigator) represents the item.

Отличный ответ, гораздо более правильный, чем реальный ответ ;-). Я искал официальный документ о поддержке (и использовании?) XDM, но не нашел. Может быть, Кадлучка знает кого-нибудь?

Abel 20.01.2010 18:35

Г-н Кадлучка не рекомендовал ни одного такого документа. Я рекомендую связаться с командой Microsoft XML через их блог по адресу blogs.msdn.com/xmlteam, если у вас есть какие-либо конкретные вопросы.

John Ingle 20.01.2010 20:54

Другие вопросы по теме