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

时间:2013-05-12 20:08:30

标签: xml xslt internet-explorer-8

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

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"?>

1 个答案:

答案 0 :(得分:1)

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

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

我们可以知道您的DTD中有什么内容吗?我无法想到任何会妨碍转型继续进行的事情,但看到它可能会很好。

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


<强>更新

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

this similar problem on GNT。看起来错误是因为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>