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

时间:2009-12-11 15:36:20

标签: c# xslt

我必须在我的XSLT文件中包含一个C#脚本。所以计算两个dateTime值之间的差异(并将其添加到其他一些值)..我需要接受所有可能的日期格式 ..我想用XSLT做它...但是因为XSLT不允许这样做(含蓄地)..我发现这个调用C#脚本的方法..我必须从许多不同的C#程序中调用XSL转换。所以在所有调用C#代码中编写此代码将是痛苦的(相当不可能)。:(你能找到一些补救措施吗)

这是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>

,错误是:

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

  2. 找不到类型或命名空间名称'CultureInfo'(您是否缺少using指令或程序集引用?)

  3. ThanQ非常.. Jon Skeet

3 个答案:

答案 0 :(得分:6)

这些是来自C#编译器的错误。您需要提供有关您正在尝试做的事情的更多信息。

听起来你至少缺少使用指令:

using System.Globalization;

但你还没有说出错误在哪里或者你在做什么。

编辑:如果您无法更改其他内容,请将对DateTimeStylesCultureInfo的引用更改为完全限定:

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);

答案 1 :(得分:3)

错误就在这一行:

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

您是否引用了System.Globalization命名空间?

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

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

答案 2 :(得分:3)

将脚本移动到扩展对象中通常更容易;你通过在基本对象上公开常规方法,并使用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 version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:bar="my-namespace" >
    <xsl:template match="xml">
      <result value="{bar:dateDiff(date1,date2)}"/>
    </xsl:template>
</xsl:stylesheet>

的xml:

<?xml version="1.0" encoding="utf-8" ?>
<xml>
  <date1>01/01/2001 00:00:00</date1>
  <date2>2/2/2002 00:00:00</date2>
</xml>