将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"?>
。
答案 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>