Javascript JScript/VBScript错误

Javascript JScript/VBScript错误,javascript,xml,xslt,vbscript,Javascript,Xml,Xslt,Vbscript,我试图让一个脚本使用不同的xslt样式表将xml文件自动转换为几个html文件。然而,无论我尝试什么,我都会出错。我在VBscript和JScript中都试过了,但都有错误。xml文件为537KB,xsl文件为5KB 这里是JScript中的迭代1。此脚本适用于我的一个样式表(创建较小html文件的样式表),但在创建较大html文件的样式表上,它在outstr上给我一个“无效过程调用或参数”(好像outstr没有正确返回)错误: 这里是迭代2,使用transformNodeToObject方法。

我试图让一个脚本使用不同的xslt样式表将xml文件自动转换为几个html文件。然而,无论我尝试什么,我都会出错。我在VBscript和JScript中都试过了,但都有错误。xml文件为537KB,xsl文件为5KB

这里是JScript中的迭代1。此脚本适用于我的一个样式表(创建较小html文件的样式表),但在创建较大html文件的样式表上,它在outstr上给我一个“无效过程调用或参数”(好像outstr没有正确返回)错误:

这里是迭代2,使用transformNodeToObject方法。在本例中,我在msxml6.dll中得到一个“未指定错误”代码80004005:

var xsl = new ActiveXObject("MSXML2.DomDocument.6.0");
xsl.async = false;
var boolval = xsl.load("../Commands/commands.xsl");
if(!boolval)
{
    WScript.Echo("XSL load error");
    WScript.Quit();
}
var xml = new ActiveXObject("MSXML2.DomDocument.6.0");
xml.async = false;
boolval = xml.load("../Commands/commands.xml")
if(!boolval)
{
    WScript.Echo ("XML load error " );
    WScript.Quit();
}

var result = new ActiveXObject("MSXML2.DomDocument.6.0");
xml.transformNodeToObject(xsl, result);

result.save("../Commands/commands.html");

我的直觉是,处理器无法处理创建这么大的文件。这是对的,还是我做错了什么。如果这只是一个大小问题,那么在vbscript/jscript中是否有其他库/对象可以用来完成这项工作?

在任何情况下,几kB的XML都不会破坏MSXML。您机器的内存是有限的,所以文件大小不是问题。另外,宿主语言(JScript或VBScript)的选择完全不相关,VBScript除了JScript之外没有其他功能,反之亦然。你在这里做COM,所以语言也不是问题。停止朝那个方向看是安全的

这就留下了一种可能性。你一定做错了什么事这可能包括MSXML配置或计算机上的安装问题,甚至可能是错误的文件系统访问设置或进程凭据

由于我无法在您的代码中发现直接的问题,并且您没有提供任何XML进行测试,因此我只能推荐一些可能有助于调试此代码的方法。试一下,不一定要按那个顺序:

  • 检查所有XML文件的格式是否正确,编码是否正确。我相信你已经做完了。将它们加载到IE中就足够了,如果这样做有效的话,它们是好的
  • 删除并重新安装MSXML,确保还安装了旧版本(4.0)
  • 下载并在命令行上进行转换,以检查它们是否工作——这个小小的工具在内部使用MSXML,过去从未让我失望过
  • 使用
    “MSXML2.DomDocument.4.0”
    尝试您的代码,因为无论如何使用6.0都没有明显的好理由(我想除了“更新更好”之外)
  • 只是为了排除它,作为一个原因,以管理员级别的用户身份在另一台机器上运行整个过程。查看错误是否可再现
  • 如果一切都失败了,把文件上传到某个地方,把链接贴在这里,我也会看一看

希望这有帮助。

Tomalak,谢谢你的帮助。我尝试了以上所有方法。xml/xsl格式良好。安装/重新安装没有任何区别。我能在另一台机器上复制它。4.0给出了基本相同的结果(尽管在迭代2中没有给出错误,但生成了一个空的html文件)。msxsl.exe工作得很好,因此这可能是使用的解决方案,尽管我无法让它与脚本一起工作令人沮丧。我已经将这些文件上传到,主要是出于好奇,因为msxsl.exe解决方案是有效的,所以如果您愿意。。。再次感谢。错误是-您不能同时使用“TransformNodeToObject”和“”。将其更改为“”,它将工作。(提示:“TransformNodeToObject”尝试将输出保存到XML DOM中。)除此之外,我认为通常建议通过DOMDocument.save()保存转换结果。使用字符串和TextStream对象可能会破坏声明编码和实际编码之间的一致性。如果将FileStream对象声明为Unicode,则第一个代码示例(CreateTextFile)将起作用。只需将CreateTextFile()的第三个参数设置为True)。但正如我所说,我反对这种做法。相关阅读:对你的转变的一些评论:考虑最后使用所有这些小模板的CSS类。所有这些冗余的CSS样式信息极大地膨胀了结果文档。可以使用XPath联合运算符合并相等的模板,例如。将文本(如“ ;”s)包装到节点中,以分离XSL代码和XSL格式空白。这有利于输出的格式。哦,在HTML和XML中两次使用相同的ID是非法的(即“)。
var xsl = new ActiveXObject("MSXML2.DomDocument.6.0");
xsl.async = false;
var boolval = xsl.load("../Commands/commands.xsl");
if(!boolval)
{
    WScript.Echo("XSL load error");
    WScript.Quit();
}
var xml = new ActiveXObject("MSXML2.DomDocument.6.0");
xml.async = false;
boolval = xml.load("../Commands/commands.xml")
if(!boolval)
{
    WScript.Echo ("XML load error " );
    WScript.Quit();
}

var result = new ActiveXObject("MSXML2.DomDocument.6.0");
xml.transformNodeToObject(xsl, result);

result.save("../Commands/commands.html");