将XSLT应用于下面列出的XML文件时,找不到匹配项。此转换正在Internet Explorer 8中使用Msxml2库在客户端执行。尽管我的最终应用要复杂得多,但下面的简单测试失败了。XSLT无法匹配,名称空间和Doctype问题
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"?>
。
您需要编辑问题并提供客户端代码的完整(但很小)的示例 - 以便人们可以独立地重现问题。直到完成,这个问题相当悬而未决 - 允许不同的解释并迫使人们去猜测。另外,为什么IE8?最新发布的MS浏览器 - Win 7和Win 8都是IE10。非常重要的一点是,我相信你不需要DTD(至少XSLT对它的使用很少)。即使打算进行验证,也可以在每个http请求上离线执行,而不是数千次。 – 2013-05-12 21:02:52
尝试在每次调用Load()方法前添加:'xml2.async = false;'和'xsl2.async = false;'。在这里看到一个工作示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ms761399(v=vs.85).aspx – 2013-05-12 21:39:10
@DimitreNovatchev:我试着用标志设置两种方式我的测试,而且它似乎是MSXML拒绝生成一个无效的XML文档输出。请参阅下面的答案。 – Borodin 2013-05-12 22:07:53