C# 强制xslt将版本2与xslCompiledTransform一起使用
我有以下xslt,我需要使用xslt 2.0版函数,如“格式化日期”。如何使用XsltCompiledTransform类(c#,.net 4.5)声明Xsl工作表以使用2.0版C# 强制xslt将版本2与xslCompiledTransform一起使用,c#,xslt,.net-4.5,C#,Xslt,.net 4.5,我有以下xslt,我需要使用xslt 2.0版函数,如“格式化日期”。如何使用XsltCompiledTransform类(c#,.net 4.5)声明Xsl工作表以使用2.0版 表{边框折叠:折叠;字体系列:“Verdana”;} 表,td{边框:1px纯黑色;颜色:黑色;背景色:白色;字体系列:“Verdana”;} 表格,th{边框:1px实心黑色;背景色:黑色;颜色:白色;字体系列:“Verdana”;} .rt{颜色:红色;字体系列:“Verdana”;} .nt{颜色:黑色;字体系
表{边框折叠:折叠;字体系列:“Verdana”;}
表,td{边框:1px纯黑色;颜色:黑色;背景色:白色;字体系列:“Verdana”;}
表格,th{边框:1px实心黑色;背景色:黑色;颜色:白色;字体系列:“Verdana”;}
.rt{颜色:红色;字体系列:“Verdana”;}
.nt{颜色:黑色;字体系列:“Verdana”;}
.redb{颜色:黄色;背景色:红色;字体系列:“Verdana”;}
.greenb{颜色:白色;背景色:绿色;字体系列:“Verdana”}
.black{颜色:白色;背景色:黑色;字体系列:“Verdana”}
电子数据交换验证结果
采购订单的电子数据交换验证结果
从……收到。
位置
项目代码
计量单位
订购数量。
装船请求
净报价
网络目录
地位
好啊
订单验证失败,
由于存在错误行,因此不会处理订单。
根据商定的处理规则,订单被拒绝。
订单成功验证。
将很快通过电子邮件订购确认(非edi)。
微软的XslCompiledTransform是XSLT1.0处理器。要将XSLT2.0与.NET一起使用,您有两个第三方选项,即来自或的.NET版本的Saxon 9。Saxon有一个开源版本,他和两个商业版本PE和EE,商业使用的XmlPrime需要许可证。正如Martin所写,微软的处理器只支持1.0——即使是现在,2016年。我有一个类似的问题(我需要在XSLT中使用正则表达式),我通过使用内联C#来解决这个问题
我的解决方案基于以下示例:
您必须向xsl:stylesheet
节点添加一些内容。我的看起来像:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
exclude-result-prefixes="msxsl">
当然,考虑安全性——确保XSLT文件只包含可信和/或消毒输入,如果您允许执行任意的C脚本,则 作为已批准答案的补充,这里是@TonyP关于使用Microsoft的
格式日期
的评论的扩展
MSDN文件格式日期:
示例
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xsl msxsl"
>
<!-- ... --->
<td class="redb"><xsl:value-of select="msxsl:format-date(RequiredBy,'d MMMM yyyy')"/></td>
<!-- ... --->
注意:MS的日期格式化选项远不如XSLT2.0中的选项丰富(参见文档);因此,我相信
d MMMM yyyy
格式是最接近您所追求的格式。显然,msxsl ns为xslt 1.0处理器提供了扩展的函数集,包括format-date()。
<!-- Script to check for URLs in values -->
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public string ExtractUrl(string str)
{
return Regex.Match(str, @"(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))").Value;
}
]]>
</msxsl:script>
<xsl:variable name="extractedUrl" select="user:ExtractUrl(.)"></xsl:variable>
XsltSettings settings = new XsltSettings(false, true); // enable script execution
XsltCompiledTransform transform = new XslCompiledTransform();
transform.Load("template.xsl", settings, new XmlUrlResolver());
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="xsl msxsl"
>
<!-- ... --->
<td class="redb"><xsl:value-of select="msxsl:format-date(RequiredBy,'d MMMM yyyy')"/></td>
<!-- ... --->