Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制xslt将版本2与xslCompiledTransform一起使用_C#_Xslt_.net 4.5 - Fatal编程技术网

C# 强制xslt将版本2与xslCompiledTransform一起使用

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{颜色:黑色;字体系

我有以下xslt,我需要使用xslt 2.0版函数,如“格式化日期”。如何使用XsltCompiledTransform类(c#,.net 4.5)声明Xsl工作表以使用2.0版


表{边框折叠:折叠;字体系列:“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>
<!-- ... --->