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

Inf*_*nd' 6 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

<xsl:variable name ="date1"select ="// date1"/> <xsl:variable name ="date2"select ="// date2"/>

<msxsl:script language ="C#"implements-prefix ="cs"> <![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);
Run Code Online (Sandbox Code Playgroud)

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

    }
]]>
Run Code Online (Sandbox Code Playgroud)

</ msxsl:script>
<xsl:template match ="datediff">
<xsl:element name ="{local-name()}">
<xsl:value-of select ="cs:datediff($ date1,$ date2 )"/>
</ xsl:element>
</ xsl:template>

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

请帮我克服这个错误..

Inf*_*nd' 9

正如史蒂夫库珀提到的那样..你需要启用 XSLT脚本..以下是这样做的方法:

首先定义一个新settings实例:

var settings = new XsltSettings();
Run Code Online (Sandbox Code Playgroud)

然后启用脚本

settings.EnableScript = true;
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*per 8

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());
Run Code Online (Sandbox Code Playgroud)

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