如何在C#中启用XSLT脚本..?

我找到答案后修改了问题的标题:):P

我正在通过C#程序加载XML文件和XSL文件并触发XSL转换..这里是代码:

static void Main(string[] args) { // Create the XslCompiledTransform and load the stylesheet. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("input.xsl"); //located in Debug folder //Load XSL argument list XsltArgumentList xslArg = new XsltArgumentList(); // Transform the file. using (XmlWriter w = XmlWriter.Create("output.xml")) { xslt.Transform("input.xml", xslArg, w); //located in Debug folder } } 

错误是我无法加载XML文件。

XSL文件包含一些C#代码,用于计算两个DateTime字符串之间的差异..好吧,我可以使用相同的XSL文件手动转换XML文件..但是当我尝试使用C#代码触发转换时..然后它说“它无法加载XML文件”

这是我的(部分)XSL代码..

<![CDATA [public string datediff(string date1,string date2){

  DateTime startTime = new DateTime(Convert.ToInt32(date1.Substring(6, 4)), Convert.ToInt32(date1.Substring(0, 2)), Convert.ToInt32(date1.Substring(3, 2)), Convert.ToInt32(date1.Substring(11, 2)), Convert.ToInt32(date1.Substring(14, 2)), Convert.ToInt32(date1.Substring(17, 2)), 0); DateTime endTime = new DateTime(Convert.ToInt32(date2.Substring(6, 4)), Convert.ToInt32(date2.Substring(0, 2)), Convert.ToInt32(date2.Substring(3, 2)), Convert.ToInt32(date2.Substring(11, 2)), Convert.ToInt32(date2.Substring(14, 2)), Convert.ToInt32(date2.Substring(17, 2)), 0); 

返回(endTime.Subtract(开始时间));

  } ]]> 

是这样,因为脚本(C#代码计算日期差异..)我收到此错误?
顺便说一句,当我使用其他输入XML和XSL文件时,C#代码运行得很好。

请帮我克服这个错误..

正如Steve cooper所提到的……你需要启用 XSLT脚本..以下是这样做的方法 :

首先定义一个新的settings实例:

 var settings = new XsltSettings(); 

然后启用脚本

 settings.EnableScript = true; 

创建XslCompiledTransform对象并加载样式表,传入settings对象。

在MSDN文档中,它说“默认情况下禁用XSLT脚本。只有在需要脚本支持并且您在完全受信任的环境中工作时,才应启用XSLT脚本。”

这可能是你的问题。 尝试像这样加载变换;

 XslCompiledTransform xslt = new XslCompiledTransform(); // Disable script blocks and the document() function // if a stylesheet came from an untrusted source string untrustedUri = @"http://www.untrusted-site.com/meow.xsl"; XmlResolver secureResolver = new XmlSecureResolver(new XmlUrlResolver(), untrustedUri); xslt.Load(untrustedUri, XsltSettings.Default, secureResolver); // Enable script blocks and the document() function // if a trusted stylesheet needs them xslt.Load(@"C:\MyProject\purr.xsl", XsltSettings.TrustedXslt, new XmlUrlResolver()); 

您也可以在问题中添加一些细节; 你能说你怎么能够手动完成吗? 你使用什么程序或引擎? 例如,XMLSpy使用与.Net框架不同的转换引擎,因此XSL文件可以是不兼容的。

我建议尝试完全单独加载XML文件 – 我不会惊讶地发现这与XSL没有任何关系,并且所有与它无法找到文件或类似的东西有关。

尝试将XML文件加载到XmlDocument并检查它是否正确。 如果IXPathNavigable ,请使用接受IXPathNavigable作为输入的重载 ( XmlDocument实现IXPathNavigable )。

定义设置变量启用脚本模式,然后在加载过程中使用它。

 var settings = new XsltSettings(); settings.EnableScript = true; XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("input.xsl", settings , null); 

它对我有用。 问候!