是。净3.5XPath类和方法XSLT2.0兼容吗?
题
我想利用经常表达的选择元用于匹配的功能。我不喜欢使用一个外部图书馆(例如撒克逊人的)这样做。
解决方案
有一些事情在XSLT2.0不支持在建造在图书馆(没有讨论单的邮件列表关于这一点,但我找不到信息了).但大多数人从来没有遇到角落的情况下,不支持。
另一种选择是,检查了开放源 http://saxon.sourceforge.net/ 这具有极大的支持2.0.
编辑(AB):上述接受的答案可能造成混淆。有没有支持所有 没有计划在这个方向 对于任何XPath2.0or XSLT2.0功能。网。
其他提示
我相信答案在这里的讨论是一种误导。我认为。净3.5不支持最XSL/T2.0职能(如果有的话).
一个例子:
呼叫2.0功能提供以下错误信息。净3.5:
目前dateTime()'是一个未知的XSLT功能。
我认为答案上是错误的。我找不到任何证据表明,微软支持XSLT2.0.XSLT!= XPath。
对于未来的参考,这是一个很好的网页上延伸xpath/谢谢。网:
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 namespace宣言》(在XSLT file)
<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 file)
<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语言,但是使用扩展的对象。净和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>
当讨论。净支持XSLT2.0,XPath2.0,谢谢1.0,重要的是要区分自己的语言和数据模型(它).。净3.5框架支持的数据模型,而不是语言。因为它是最近向我解释通过电子邮件往来由微软帕维尔Kadluczka:
句子中的"实例的,谢谢 1.0和XPath2.0数据模型"可能令人困惑但是我认为,它指的是 W3C属1.0和XPath2.0数据 模型(它)规范 (http://www.w3.org/TR/xpath-datamodel) 这一读取:
[定义:每一个实例 数据模型是一个序列。].
[定义:一序列是一个有序 收集的零或更多的项目。] 一个 顺序不能中的一员 序列。一个单一的项目上出现 自己是模仿作为一个序列 包含一个项目。序列 定义在2.5序列。
[定义:一个项目是一个节点 或原子值],
在这种情况下的XPath API- XPathNodeIterator是的序列 同时,是否(XPathNavigator) 表示该项目。
是的,3.5XPathNavigator支持XSLT2.0.
http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx
"XPathNavigator类的系统。Xml。XPath名称空间是一个抽象的类定义标模型,用于导航和编辑XML信息项目为实例,谢谢1.0和XPath2.0数据模型"。