Xml XSLT无法匹配、命名空间和Doctype问题

Xml XSLT无法匹配、命名空间和Doctype问题,xml,xslt,internet-explorer-8,Xml,Xslt,Internet Explorer 8,将XSLT应用于下面列出的XML文件时,找不到匹配项。此转换正在Internet Explorer 8中使用Msxml2库在客户端执行。虽然我的最终应用程序要复杂得多,但下面的简单测试失败了 XML: 不同的操作系统和不同的IE版本是不可协商的,因为这是一个公司应用程序,唯一可用的IE是版本8.0。(上面的代码允许我将文件写入本地PC的原因是它是一个HTML应用程序(.hta),因此安全限制被禁用。) 上面的output.txt仅显示了MSXML2的最新版本是2.6版,上一次更新是在2004年,

将XSLT应用于下面列出的XML文件时,找不到匹配项。此转换正在Internet Explorer 8中使用Msxml2库在客户端执行。虽然我的最终应用程序要复杂得多,但下面的简单测试失败了

XML:

不同的操作系统和不同的IE版本是不可协商的,因为这是一个公司应用程序,唯一可用的IE是版本8.0。(上面的代码允许我将文件写入本地PC的原因是它是一个HTML应用程序(.hta),因此安全限制被禁用。)


上面的output.txt仅显示了MSXML2的最新版本是2.6版,上一次更新是在2004年,被认为已经过时

如果我是你,我会使用一个不同的处理引擎,因为这个样式表在我可以访问的所有引擎上都很适合我

我们可以知道您的DTD中有什么吗?我想不出任何东西会阻止转换的进行,但看到它可能会很好


MSXML的最新版本是6.0版,预装在Windows 7上。可从for XP的下载


更新

好的,我取得了一些成功。我发现了MSXML中可能存在的错误,因为它不会创建任何无效的XML输出-即使样式表中的
output
元素说
method=“text”
。这与XSLT标准相反,但却是典型的Microsoft

看。出现错误的原因可能是
DOMDocument.transformNodeToObject
正在被用于转换到另一个
DOMDocument
对象,该对象不能表示纯文本。显然,它在这里也会接受一个简单的流对象,但我没有进一步考虑,因为这里不需要文本输出

如果我从XML中删除
DOCTYPE
,并在样式表输出的文本周围添加一个根元素,那么我就可以让您的代码正常工作,如下所示

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dxl="http://www.lotus.com/dxl">

  <xsl:template match="dxl:document">
    <root>
      <xsl:text>It worked!</xsl:text>
    </root>
  </xsl:template>

</xsl:stylesheet>

成功了!
它产生这个输出

<?xml version="1.0" encoding="UTF-16"?>
<root xmlns:dxl="http://www.lotus.com/dxl">It worked!</root>

成功了!

DTD的大小为200KB,但IE在转换时是否可以访问DTD不会改变转换的结果。建议使用哪些其他XSLT引擎?最好是已经默认安装在Windows XP/7计算机上的。我在回答中添加了一个选项,以指示可以从何处获取最新的MSXML。MSXML版本6.0通过调用MSXML2并在类中指定版本号来实例化。e、 g.(我就是这样称呼它的)
newActiveXObject(“Msxml2.DOMDocument.6.0”)
。你是说当你调用它时,它能正常工作?啊,好的。你说的是ProgID。他们将前缀冻结在MXSML2.0,其ProgID为
MSXML2.DOMDocument
。对于3.0来说,它是
MSXML2.DOMDocument.3.0
,它的后缀从那时起就发生了变化。感谢微软让我如此困惑。我使用的是MSXML 4.0,因为我的XML编辑器中没有6.0。我会用6.0做一些尝试,但我怀疑它是否会失败。输出是
它工作了。我想您不会因为它隐藏在同一行的XML声明后面而错过它吧?您需要编辑这个问题,并提供一个完整(但很小)的客户端代码示例,以便人们能够独立地重新编写这个问题。在这之前,这个问题一直悬而未决——允许不同的解释,迫使人们进行猜测。还有,为什么是IE8?Win7和Win8最新发布的MS浏览器是IE10。非常重要的是,我相信您不需要DTD(至少XSLT很少使用它)。即使是为了验证,最好是离线完成,而不是在每个http请求上进行数千次
xsl2.async=falseLoad()
方法之前执行code>。请参见此处的一个工作示例:@DimitreNovatchev:我在测试中使用双向设置的标志进行了尝试,结果似乎是MSXML拒绝为输出生成无效的XML文档。请看下面我的答案。@Borodin,是的,但OP使用的是
TransformNode()
——而不是
TransformNodeToObject()
。10年前我最后一次使用MSXML时…@ DimitreNovatchev:你说得对:我没有研究他所显示的C++代码。当我改为使用
transformNode
时,一切正常。恐怕我没有主意了。
var xml2;
var xsl2;

$.get("test2.xml", function(data) { getXSL(data); });

function getXSL(data) {
    xml2 = new ActiveXObject("Msxml2.DOMDocument.6.0")
    xml2.loadXML(data);

    $.get("test2.xsl", function(data) { transformCriteriaXML(data); });
}

function transformCriteriaXML(data) {
    xsl2 = new ActiveXObject("Msxml2.DOMDocument.6.0")
    xsl2.loadXML(data);

    var outFile;
    var objFSO = new ActiveXObject("Scripting.FileSystemObject");
    outFile = "output.txt";
    var objFile = objFSO.CreateTextFile(outFile, true);
    objFile.Write(xml2.transformNode(xsl2));
    objFile.Close();
}
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dxl="http://www.lotus.com/dxl">

  <xsl:template match="dxl:document">
    <root>
      <xsl:text>It worked!</xsl:text>
    </root>
  </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-16"?>
<root xmlns:dxl="http://www.lotus.com/dxl">It worked!</root>