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