在 XSL 文件中嵌入日期格式化脚本






2.86/5 (4投票s)
2004年11月12日
4分钟阅读

45418

2
此示例演示如何使用 Microsoft 的 XSL 脚本扩展向 XSL 文件添加自定义脚本。
引言
如果您经常使用 XSL,有时会遇到 XSL 基于集合的特性带来的限制。如果您在 Microsoft 的 .NET 平台上使用 XSL,您可以采取一些措施来解决这些问题。当我想要进行一些日期格式化时,我在 XSL 中遇到一个问题。我发现对于日期解析,基本的 XSL 函数很糟糕。如果您想使用更强大的函数,可以查看 EXSLT。但是,我尝试了这种方法,尽管有很多文章介绍如何在 .NET 中使用 EXSLT,但它们大多围绕着一个在 gotdotnet 上编写的扩展。
我对 gotdotnet 项目有固有的信任,因为——我知道这听起来像个愚蠢的理由——gotdotnet 工作区软件很糟糕。GotDotNet 似乎大部分时间都处于停机状态(例如,今天当我下载 EXSLT 文件时,它就停机了),我总是找不到任何东西——搜索很糟糕,看起来完全没有组织。他们真的需要向 SourceForge 或 CodeProject 学习。此外,我不得不嘲笑我总是看到的自定义错误,它告诉我 gotdotnet 的管理员已经意识到这个问题了。可怜的人们——他们一定非常忙碌。
无论如何,如果您愿意使用这个自定义扩展 EXSLT.NET,并且您实际上可以下载它,我相信它非常好。但是,它需要将您的项目链接到一个 DLL,尽管您获得了源代码,但我只是不确定我的问题是否需要这样一个重量级的解决方案。哦——我的问题?我只是想将 XSL 样式表中的节点返回的日期从日期时间转换为完整文本格式。这应该不那么复杂吧?好吧,我不想仅仅为了这个而使用 EXSLT.NET。所以,我将为您提供另一种选择。您可以在 XSL 页中嵌入脚本。虽然这可能不是所有情况下的最佳解决方案,但在您无法轻松更改和重新编译您编写的转换样式表的后端引擎,但您可以轻松访问 XSL 文件时,它可以很好地工作。因此,要做到这一点,您首先声明您的命名空间
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform "version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:myutils="http://mycoolplace.com">
- 第一行到目前为止您应该非常熟悉 :-)
- 第二行只是告诉编译器您想使用很棒的 Microsoft 扩展。
- 第三行告诉解析器您没有疯,您确实将包含来自 `myutils` 命名空间的一些函数——当您遇到那个奇怪的函数时请不要担心——只需继续您的解析方式,直到您稍后在代码中找到它。
接下来,像往常一样创建您的 XSL 样式表。当您到达样式表中想要调用自定义函数的部分时,例如在模板匹配内,只需执行此操作
<xsl:template match="TheItemThatNeedsAPrettyDate">
<xsl:value-of select="utils:ConvertDate(DateItem)"/>
</xsl:template>
`DateItem` 包含我们要转换的日期。在这种情况下,它应该直接位于匹配节点下方。理论上,您应该能够给出任何 XPath 表达式——但是,我遇到了令人讨厌的麻烦,所以我不知道我的 XPath 表达式是否错误,或者是否存在其他问题。我最终放弃了,因为基本的表达式(这正是我项目所需的一切)有效。
现在我们需要创建函数:只需在文件底部(样式表结束标签上方)执行此操作
<msxsl:script language="C#" implements-prefix="myutils">
public string ConvertDate( XPathNodeIterator nodeit )
{
if(nodeit.MoveNext())
{
XmlNode node = ((IHasXmlNode)nodeit.Current).GetNode();
try
{
DateTime dt = DateTime.Parse( node.InnerText );
return dt.ToString( "f" );
}
catch
{
return "Convert Error";
}
}
return "No date found";
}
</msxsl:script>
这里有很多关于 `XPathNodeIterator` 的有趣内容——我不知道微软是谁想出了这种奇怪的复杂语法,但请放心——有更好的方法!!!似乎微软使用这个 `XPathNodeIterator` 和整个 `XPathNavigator` 混乱只是为了让我们的生活更艰难。希望在 .NET 的下一个版本中,这会变得简单一些。我在 Orielly 的“.NET 和 XML”一书中阅读了所有相关内容,如果您想了解这里发生的事情的详细细节,我建议您购买这本书。这就是全部内容。唯一复杂的部分是将 `XPathNodeIterator` 转换为真正有用的东西。好了,就是这样。如果有人表示兴趣,我会很快重新访问这篇文章并发布关于 `XPathNodeIterator` 如何工作的更详细解释。如果有人感兴趣,我也会上传一些示例文件。我希望这能帮助到一些人。
许可证
本文没有附加明确的许可证,但可能包含文章文本或下载文件本身中的使用条款。如有疑问,请通过下面的讨论区联系作者。作者可能使用的许可证列表可在 此处找到。