更优秀的 MSXSL.EXE:添加使用嵌入式脚本转换 XSL 的能力






4.50/5 (4投票s)
2004年11月18日
2分钟阅读

74819

1310
这个程序创建了一个围绕 XSLT 进程的包装器,允许你使用嵌入的 MSXSL 脚本转换 XML 文件。
引言
我在一个项目中使用了 XSL 转换。到目前为止,我对 XSL 及其功能非常满意。然而,有时我发现自己花费大量时间试图使用 XSL 的基于集合的结构解决问题。通常,你可以解决这些问题,但通常需要大量的工作。在某些情况下,特别是处理日期时,我发现 XSL 的支持非常薄弱(或者根本没有)。这就是嵌入式脚本发挥作用的地方。如果我无法使用 XSL 找到问题的解决方案,我通常会转向用 C# 编写的嵌入式脚本来帮助解决问题。我写了另一篇文章,其中包含如何执行此操作的基本示例。最初,我是在自定义应用程序中转换样式表。但是,这很繁琐,我不想一直等待整个程序加载,只是为了检查 XSL 中是否有错误。因此,我下载了 Microsoft 的 MSXSL.EXE 程序,并尝试使用它来转换 XSL。我发现 MSXSL 无法转换文件。我一直收到错误:无效的类文件。我不确定这是否发生的原因,但我的想法是 MSXSL.EXE 是围绕 MSXML 4.0 的一个包装器。我不认为 MSXML 4.0 支持嵌入式脚本。幸运的是 - .NET 支持!因此,我编写了自己的包装器来让我转换 XSL。下面是包装器应用程序的相关代码
static void Main(string[] args)
{
if( args.Length != 3 )
{
Console.WriteLine( "You have not entered the correct parameters" );
return;
}
string xmlfile = args[0];
string xslfile = args[1];
string outfile = args[2];
try
{
XPathDocument doc = new XPathDocument( xmlfile );
XslTransform transform = new XslTransform();
transform.Load( xslfile );
XmlTextWriter writer = new XmlTextWriter( outfile, null );
transform.Transform( doc, null, writer );
}
catch( Exception e )
{
Console.WriteLine( e.StackTrace );
}
}
它相当基础 - 但非常有用。下面是一个示例 XML 文件、XSL 文件以及我用作测试的输出文件。
atest.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<dataitem>From the xml file: item 1</dataitem>
<dataitem>From the xml file: item 2</dataitem>
<dataitem>From the xml file: item 3</dataitem>
<dataitem>From the xml file: item 4</dataitem>
</root>
atest.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:utils="urn:script-items">
<msxsl:script language="C#" implements-prefix="utils">
<![CDATA[
public string getDate(){
return (DateTime.Today.ToLongDateString() + " at " +
DateTime.Now.ToLongTimeString() );
}
]]>
</msxsl:script>
<xsl:output method="html" encoding="utf-8" />
<xsl:template match="dataitem">
<xsl:value-of select="." /> displayed on <xsl:value-of select="utils:getDate()" />
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
你可以使用以下命令转换它
myxsl atest.xml atest.xsl atest.htm
你会得到结果
atest.htm
From the xml file: item 1 displayed on Thursday, November 18, 2004 at 2:38:26 PM
From the xml file: item 2 displayed on Thursday, November 18, 2004 at 2:38:26 PM
From the xml file: item 3 displayed on Thursday, November 18, 2004 at 2:38:26 PM
From the xml file: item 4 displayed on Thursday, November 18, 2004 at 2:38:26 PM
我还将所有必需的内容包含在源代码和演示项目中。希望这能帮助到某人。