我想找出使用XSLT在我的XML文件中出现在两个不同元素中的两个日期(以分钟为单位)之间的差异。我不能使用这个函数,因为我使用的是visual studio 2008,在版本1.0中不支持XSLT函数。
Ex-11/12/2009 12:00 AM 12/01/2010 12:00 PM我也必须始终看到date2> date1。提前完成。
虽然我已经成功地在某种程度上做了相似(但比较小)的计算......(将它们视为字符串)使用模板..我终于可以得出结论......“模板”不能取代“函数”但是我的应用程序的问题是它可以很容易地与Visual Studio接口,而不是任何其他应用程序(嗯,这个接口必须做许多其他功能而不是触发XSL转换)所以毫无疑问使用其他应用程序而不是visual studio。 / p>
有一个名为exslt.com的网站,我从那里下载了一个现成的模板..但是无法让它以我的方式工作..所以我发布了这个Q,不期待有人发布完整的解决方案但是任何如果找到其他替代方式..比如使用其他一些语言(C#,javascript等)和XSLT(但不超出XSLT 1.0)..在此先感谢.. :)
答案 0 :(得分:2)
如果您说XML文件中的数据格式为11/12/2009 12:00 AM
,并且您希望能够与它们进行比较和计算。令人失望的是,我认为你可能不走运。
XSLT 2.0和XPath 2.0一起使用xs:date
和xs:time
等类型支持日期和时间。 XSLT 1.0不提供此支持。一些XLST实现以附加功能的形式提供了附加功能,但我看不到Visual Studio 2008提供这些功能的任何证据。此外,正如您所注意到的,如果似乎不允许您定义自己的函数,这可能是解决此问题的另一种方法。
在类似的情况下,我通过以不同的方式将日期/时间信息存储在我的XML文件中来取得进展,这种方式可以由XSLT解释。如果您只想比较日期/时间值以查看哪个更早,则将其存储为日期格式(例如ISO 8601(例如2009-11-22 15:00
)将允许您将它们作为字符串进行比较。如果您需要根据差异进行计算,您可能需要使用基于整数的格式,例如Unix time(自1970年以来的秒数)。
或者,寻找支持2.0的其他XSLT工具。
答案 1 :(得分:2)
如果通过“Visual Studio 2008”实际上是指.NET和XslCompiledTransform
,那么到目前为止最简单的处理方法是使用其scripting extension嵌入一些C#代码来处理这个问题。 E.g:
<xsl:stylesheet xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:cs="urn:cs">
<msxsl:script language="C#" implements-prefix="cs">
<![CDATA[
public int MinutesBetween(string d1, string d2) {
return (DateTime.Parse(d1) - DateTime.Parse(d2)).Minutes;
}
]]>
</msxsl:script>
...
<xsl:value-of select="cs:MinutesBetween($d1, $d2)" />
</xsl:stylesheet>