65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (4投票s)

2004年11月18日

2分钟阅读

viewsIcon

74819

downloadIcon

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

我还将所有必需的内容包含在源代码和演示项目中。希望这能帮助到某人。

© . All rights reserved.