0

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

XML:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_8_5_3.dtd'>
<document xmlns='http://www.lotus.com/dxl' version='8.5' maintenanceversion='3.0'
 replicaid='862570A600460D8C' form='Appeal'>
<item name="criteria"></item>
</document>

XSLT:

<?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">
    <xsl:text>It worked!</xsl:text>
</xsl:template>

</xsl:stylesheet>

我已经阅读了无数关于名称空间的“解决方案”并尝试了所有这些......它总是无法匹配。在几个场景中,我能够通过删除 !DOCTYPE 标记来获取整个文档,但是匹配不起作用(只是返回了所有文本并且从未显示“它有效!”

编辑:进行转换的相同代码在我的应用程序的另一部分工作,但在这种情况下不是。这是代码:

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();
}

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

上面的 output.txt 只显示<?xml version="1.0" encoding="utf-8"?>.

4

1 回答 1

1

MSXML2 的最新版本是 2.6 版,最后一次更新是在 2004 年,被认为已过时。

如果我是你,我会使用不同的处理引擎,因为这个样式表适用于我可以访问的所有引擎。

我们可以知道您的 DTD 中有什么吗?我想不出任何会阻止转换继续进行的事情,但看到它可能会很高兴。

MSXML 的最新版本是 6.0 版,它预装在 Windows 7 上。可从Microsoft 下载中心下载它。


更新

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

在 GNT 上看到这个类似的问题。看起来错误是因为DOMDocument.transformNodeToObject正在用于转换为另一个DOMDocument无法表示纯文本的对象。显然它也会在这里接受一个简单的流对象,但我没有进一步查看,因为这里不需要文本输出。

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

<?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>
于 2013-05-12T20:25:07.313 回答