




Да, 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».
Я не знаю; это задокументировано. msdn.microsoft.com/en-us/library/…
XSLT - это не то же самое, что XPath или XQuery, поэтому он действительно не поддерживает XSLT 2.0 (есть несколько вещей, которые он выполняет, но не много).
@Scott: Боюсь, здесь нет даже "нескольких вещей". Ни XPath 2.0, ни XSLT 2.0 не поддерживаются. Они объявили о реализации, но позже снова отозвали это.
В XSLT 2.0 есть некоторые вещи, которые не поддерживаются встроенными библиотеками (в моно-списке рассылки было обсуждение этого вопроса, но я больше не могу найти информацию). Но большинство людей никогда не сталкиваются с крайними случаями, которые не поддерживаются.
Другой вариант - проверить http://saxon.sourceforge.net/ с открытым исходным кодом, который отлично поддерживает 2.0.
РЕДАКТИРОВАТЬ (AB): принятый выше ответ может сбивать с толку. Нет никакой поддержки, и есть нет планов в этом направлении для любой из функций XPath 2.0 или XSLT 2.0 в .NET.
«Я бы предпочел не использовать для этого внешнюю библиотеку (например, saxon)».
угловые случаи? XSLT 2.0 - это полная переработка и очень широкое расширение спецификации 1.0. В настоящее время нет никакой поддержки каких-либо новых функций XSLT 2.0 или XPath 2.0 в .NET, и больше нет планов: stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-n et
Я думаю, что у меня есть награда за это, которая автоматически выбирает ответ, получивший наибольшее количество голосов. С добавлением Авеля это теперь хороший выбор.
Я думаю, что ответ выше неверен. Я не могу найти никаких доказательств того, что Microsoft поддерживает XSLT 2.0. XSLT! = XPath.
Я думаю, что это ссылки: stackoverflow.com/questions/94047/… (автор Nikki9696)
Для справки в будущем вот хорошая страница о расширении 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, зайдите на сайт, на который я указал, и подарите им немного любви. Я украл у них все.
Я считаю, что ответ в этой дискуссии вводит в заблуждение. Я думаю, что .NET 3.5 не поддерживает большинство функций XSL / T 2.0 (если они вообще есть).
Пример:
Вызов функции 2.0 дает следующее сообщение об ошибке в .NET 3.5:
current-dateTime () - неизвестная функция XSLT.
Вы совершенно правы. XSLT 2.0 вообще не поддерживается. Ответ действительно вводит в заблуждение. Я добавил примечание к этому ответу.
Обсуждая поддержку .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, но не нашел. Может быть, Кадлучка знает кого-нибудь?
Г-н Кадлучка не рекомендовал ни одного такого документа. Я рекомендую связаться с командой Microsoft XML через их блог по адресу blogs.msdn.com/xmlteam, если у вас есть какие-либо конкретные вопросы.
Тогда почему не распознается функция совпадений?