2013-05-12 69 views
0

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

+0

您需要编辑问题并提供客户端代码的完整(但很小)的示例 - 以便人们可以独立地重现问题。直到完成,这个问题相当悬而未决 - 允许不同的解释并迫使人们去猜测。另外,为什么IE8?最新发布的MS浏览器 - Win 7和Win 8都是IE10。非常重要的一点是,我相信你不需要DTD(至少XSLT对它的使用很少)。即使打算进行验证,也可以在每个http请求上离线执行,而不是数千次。 – 2013-05-12 21:02:52

+0

尝试在每次调用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

+0

@DimitreNovatchev:我试着用标志设置两种方式我的测试,而且它似乎是MSXML拒绝生成一个无效的XML文档输出。请参阅下面的答案。 – Borodin 2013-05-12 22:07:53

回答

1

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

如果我是你,我会使用一个不同的处理引擎,因为这个样式表对我有权访问的所有引擎都能正常工作。

我们可以知道你的DTD是什么吗?我想不出任何会阻止变革进展的事情,但可能会很高兴看到它。

MSXML的最新版本是6.0版本,它预装在Windows 7上。它可以从Microsoft Download Centre下载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> 
+0

DTD大小为200KB,但在转换时是否可以通过IE访问,不会改变转换结果。建议了其他什么XSLT引擎?最好在Windows XP/7机器上默认安装一个。 – 2013-05-12 20:28:26

+0

我已添加到我的答案中,以指明您可以在哪里获取最新的MSXML。 – Borodin 2013-05-12 20:45:07

+0

MSXML版本6.0通过调用MSXML2并指定类中的版本号来实例化。例如(这就是我称之为的)'新的ActiveXObject(“Msxml2.DOMDocument.6.0”)'。你说这是什么时候调用它,它的功能是否正确? – 2013-05-12 20:56:07