2010-01-13 84 views
9

我们打算将我们的框架从msxml4迁移到msxml6。 我们在哪里使用msxsl.exe。 它似乎只支持MSXML版本高达4.0,作为命令行 msxsl.exe -u版本6.0 告诉我。 是否有msxsl.exe的后继者? 任何替代的命令行处理器?msxsl.exe的继任者?

回答

6

有很多方法可以替换现有的处理器,这取决于您需要的功能级别以及是否需要MSXML特定的功能。例如,有xsltproc这是libxslt的一部分(例如,可以从here获得一些Windows二进制文件)。 This页面为您提供了C#中的快速替换,但它们都改变了命令行用法,并且可能不会实现相同的MSXML扩展(xsltproc肯定不会)。

如果您只是对使用MSXML 6的简单命令行处理器感兴趣,那么您可能会比使用简单的JScript应用程序更糟糕。将下面的代码作为xsltr.js和运行为CSCRIPT msltr.js的input.xml template.xsl output.txt的

var adTypeBinary = 1; 
var adSaveCreateOverWrite = 2; 
var adSaveCreateNotExist = 1; 

try 
{ 
    var args = WScript.Arguments; 

    if(args.length < 3) 
    { 
     WScript.Echo("Usage: xsltr.js file.xml file.xsl output.txt"); 
     WScript.Quit(1); 
    } 
    else 
    { 
     var xml = args(0); 
     var xsl = args(1); 
     var out = args(2); 

     var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0"); 
     var xslDoc = new ActiveXObject("Msxml2.DOMDocument.6.0"); 

     /* Create a binary IStream */ 
     var outDoc = new ActiveXObject("ADODB.Stream"); 
     outDoc.type = adTypeBinary; 
     outDoc.open(); 

     if(xmlDoc.load(xml) == false) 
     { 
      throw new Error("Could not load XML document " + xmlDoc.parseError.reason); 
     } 

     if(xslDoc.load(xsl) == false) 
     { 
      throw new Error("Could not load XSL document " + xslDoc.parseError.reason);   
     } 

     xmlDoc.transformNodeToObject(xslDoc, outDoc); 
     outDoc.SaveToFile(out, adSaveCreateOverWrite); 
    } 
} 
catch(e) 
{ 
    WScript.Echo(e.message); 
    WScript.Quit(1); 
} 

不过是有一个理由,你不能使用msxsl? 4.0版本的MSXML从来不是标准安装,所以你将永远不得不手动安装它(尽管我认为它是随Office一起提供的)。您是否可以在需要处理的机器上部署第4版?