C#XSLT:如何调试此错误?

C#XSLT:如何调试此错误?,c#,xslt,C#,Xslt,我必须在XSLT文件中包含一个C#脚本。。因此,计算两个日期时间值之间的差值(并将其添加到其他值中)。。我需要接受所有可能的日期格式。。我本来打算用XSLT来做这件事。。但由于XSLT不允许(隐式地)这样做。。我找到了调用C#脚本的补救方法。。我不得不称之为来自许多不同C#程序的XSL转换。。因此,在所有调用C#code.的代码中编写此代码将是痛苦的(相当不可能的):(你能找到一些补救办法吗 这是XSLT代码。 <xsl:variable name="date1" select="//d

我必须在XSLT文件中包含一个C#脚本。。因此,计算两个日期时间值之间的差值(并将其添加到其他值中)。。我需要接受所有可能的日期格式。。我本来打算用XSLT来做这件事。。但由于XSLT不允许(隐式地)这样做。。我找到了调用C#脚本的补救方法。。我不得不称之为来自许多不同C#程序的XSL转换。。因此,在所有调用C#code.的代码中编写此代码将是痛苦的(相当不可能的):(你能找到一些补救办法吗 这是XSLT代码。

 <xsl:variable name="date1" select="//date1"/>
  <xsl:variable name="date2" select="//date2"/>
  <msxsl:script language="C#" implements-prefix="cs">
    <![CDATA[

    private static string[] formats = new string[]
    {
        "MM/dd/yyyy HH:mm:ss tt",
        "MM/dd/yyyy HH:mm:ss",
        "MM/dd/yyyy H:mm:ss tt",
        "MM/dd/yyyy H:mm:ss",
"M/dd/yyyy HH:mm:ss tt",
"M/dd/yyyy HH:mm:ss",
"M/dd/yyyy H:mm:ss tt",
"M/dd/yyyy H:mm:ss",
"MM/d/yyyy HH:mm:ss tt",
"MM/d/yyyy HH:mm:ss",
"MM/d/yyyy H:mm:ss tt",
"MM/d/yyyy H:mm:ss", 
"M/d/yyyy HH:mm:ss tt",   
"M/d/yyyy HH:mm:ss", 
"M/d/yyyy H:mm:ss tt", 
"M/d/yyyy H:mm:ss",      
    };


      public string datedif(string date1, string date2) {


            DateTime startTime;
            DateTime endTime;
            DateTime ThirdDate;

string date3="12/12/2009 00:00:00";

            DateTime.TryParseExact(date1, formats, new CultureInfo("en-US"), 
                                   DateTimeStyles.None, out startTime);
            DateTime.TryParseExact(date2, formats, new CultureInfo("en-US"), 
                                   DateTimeStyles.None, out endTime);
            DateTime.TryParseExact(date3, formats, new CultureInfo("en-US"), 
                                   DateTimeStyles.None, out ThirdDate);

ThirdDate = ThirdDate.Add(endTime.Subtract(startTime));


string result = ThirdDate.ToString("MM'/'dd'/'yyyy' 'HH':'mm':'ss");
return(result);

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

错误为:

  • 当前上下文中不存在名称“DateTimeStyles”

  • 找不到类型或命名空间名称“CultureInfo”(是否缺少using指令或程序集引用?)


  • 非常感谢..Jon Skeet

    这些都是C#编译器的错误。你需要提供更多关于你要做什么的信息

    听起来您至少缺少一个using指令:

    using System.Globalization;
    
    但是你没有说错误在哪里或者你在做什么

    编辑:如果不能更改任何其他内容,则将对
    datetimestyle
    CultureInfo
    的引用更改为完全限定:

    global::System.Globalization.DateTimeStyles
    global::System.Globalization.CultureInfo
    
    例如,你会有:

    DateTime.TryParseExact(date1, formats,
         new global::System.Globalization.CultureInfo("en-US"), 
         global::System.Globalization.DateTimeStyles.None, out startTime);
    

    这些都是C#编译器的错误。你需要提供更多关于你要做什么的信息

    听起来您至少缺少一个using指令:

    using System.Globalization;
    
    但是你没有说错误在哪里或者你在做什么

    编辑:如果不能更改任何其他内容,则将对
    datetimestyle
    CultureInfo
    的引用更改为完全限定:

    global::System.Globalization.DateTimeStyles
    global::System.Globalization.CultureInfo
    
    例如,你会有:

    DateTime.TryParseExact(date1, formats,
         new global::System.Globalization.CultureInfo("en-US"), 
         global::System.Globalization.DateTimeStyles.None, out startTime);
    

    错误出现在这一行:

    DateTime.TryParseExact(date1, formats, new CultureInfo("en-US"), DateTimeStyles.None, out startTime); 
    
    您是否引用了
    System.Globalization
    命名空间

    正如@JonSkeet所建议的,一个解决方法是更新您的引用,如下所示:

    global::System.Globalization.DateTimeStyles
    global::System.Globalization.CultureInfo
    

    错误出现在这一行:

    DateTime.TryParseExact(date1, formats, new CultureInfo("en-US"), DateTimeStyles.None, out startTime); 
    
    您是否引用了
    System.Globalization
    命名空间

    正如@JonSkeet所建议的,一个解决方法是更新您的引用,如下所示:

    global::System.Globalization.DateTimeStyles
    global::System.Globalization.CultureInfo
    

    将脚本移动到扩展对象中通常更容易;您可以通过在基本对象上公开常规方法,并使用
    XsltArgumentList
    在xslt命名空间中公开它来实现这一点:

    XsltArgumentList args = new XsltArgumentList();
    args.AddExtensionObject("my-namespace", obj);
    
    在xslt中,将名称空间别名与名称空间相关联,只需在xslt中使用“alias:someFunc(…)”。这会提供更好的IDE支持(但不能只使用xslt);例如:

    using System;
    using System.Globalization;
    using System.IO;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    public class MyExtensionObject
    {
        private static string[] formats = new string[] { /* ... */ };
        public string dateDiff(string x, string y)
        {
            CultureInfo culture = new CultureInfo("en-US");
            TimeSpan delta = DateTime.ParseExact(y, formats, culture, DateTimeStyles.None)
                - DateTime.ParseExact(x, formats, culture, DateTimeStyles.None);
            return delta.ToString();
        }
    }
    class Program
    {
        static void Main()
        {
            XsltArgumentList args = new XsltArgumentList();
            args.AddExtensionObject("my-namespace", new MyExtensionObject());
            XslTransform xslt = new XslTransform();
            xslt.Load("foo.xslt");
            using(TextWriter output = File.CreateText("out.txt")) {
                XPathDocument input = new XPathDocument("foo.xml");
                xslt.Transform(input, args, output);
            }
    
        }
    }
    
    xslt:

    
    
    xml:

    
    01/01/2001 00:00:00
    2/2/2002 00:00:00
    
    将脚本移动到扩展对象中通常更容易;可以通过在基本对象上公开常规方法,并使用
    XsltArgumentList
    在xslt命名空间中公开它来实现:

    XsltArgumentList args = new XsltArgumentList();
    args.AddExtensionObject("my-namespace", obj);
    
    在xslt中,将名称空间别名与名称空间相关联,只需在xslt中使用“alias:someFunc(…)”。这会提供更好的IDE支持(但不能只使用xslt);例如:

    using System;
    using System.Globalization;
    using System.IO;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    public class MyExtensionObject
    {
        private static string[] formats = new string[] { /* ... */ };
        public string dateDiff(string x, string y)
        {
            CultureInfo culture = new CultureInfo("en-US");
            TimeSpan delta = DateTime.ParseExact(y, formats, culture, DateTimeStyles.None)
                - DateTime.ParseExact(x, formats, culture, DateTimeStyles.None);
            return delta.ToString();
        }
    }
    class Program
    {
        static void Main()
        {
            XsltArgumentList args = new XsltArgumentList();
            args.AddExtensionObject("my-namespace", new MyExtensionObject());
            XslTransform xslt = new XslTransform();
            xslt.Load("foo.xslt");
            using(TextWriter output = File.CreateText("out.txt")) {
                XPathDocument input = new XPathDocument("foo.xml");
                xslt.Transform(input, args, output);
            }
    
        }
    }
    
    xslt:

    
    
    xml:

    
    01/01/2001 00:00:00
    2/2/2002 00:00:00
    

    显然,Visual studio调试器支持调试XSLT(带断点,…)你想让我们帮你调试代码吗?我想我会改变IDE中的菜单,在每个命令前添加“请”—让我的电脑变得更快乐……事实上,问题是它为什么不编译……请注意——实际上,xslt可以被视为一种编程语言(一种函数式编程语言)。编写某些东西可能不那么简单,但它仍然是一种编程语言。显然,Visual studio调试器支持调试XSLT(带断点,…)你想让我们帮你调试代码吗?我想我会改变IDE中的菜单,在每个命令前添加“请”—让我的电脑变得更快乐……事实上,问题是它为什么不编译……请注意——实际上,xslt可以被视为一种编程语言(一种函数式编程语言)。写一些东西可能不那么简单,但它仍然是一种编程语言。不,我做不到。我应该用XSLT来做。但是XSLT不是一种编程语言。我找到了调用C#脚本的补救方法。我必须从许多不同的C#程序调用XSL转换。所以这将是痛苦的(相当不可能)在所有调用C#代码中编写此代码:(你能找到一些补救办法吗..谢谢你的回答..然后使用Jon提到的不涉及任何使用指令的显式方法。不,我做不到..我本来想用XSLT来做..但是XSLT不是一种编程语言..我找到了调用C#脚本的补救办法..我不得不从许多不同的角度调用XSL转换erent C#程序..因此在所有调用C#代码中编写此代码将是痛苦的(相当不可能的):(你能找到一些补救办法吗?..thanx作为你的答案..然后使用Jon提到的不涉及任何使用指令的显式方法。我在编辑中建议了一种解决方法,但你仍然没有真正解释你在做什么。它们不是语句-我的观点是,在脚本中使用“DateTimeStyles”的任何地方,都要使用“全局::System.Globalization.DateTimeStyles"对于CultureInfo也是一样。不,您还没有提供任何上下文。这个XSLT脚本应用于什么?为什么您不能首先编写一个方法来完成所有这些,然后调用该方法?我建议在编辑中使用一种变通方法,但您还没有真正解释您在做什么。它们不是语句-我的观点是在使用“DateTimeStyles”的脚本中的任何地方,都可以使用“global::System.Globalization.DateTimeStyles”和CultureInfo的相同内容。不,您还没有提供任何上下文。这个XSLT脚本是什么