XML格式表未在IE9中呈现

时间:2011-11-23 09:10:36

标签: xml xslt internet-explorer-9 stylesheet

我有一个xml文档,现在甚至在IE9上都没有被识别为xml。我尝试添加正确的xmlns:xsl属性,它也有一个以

开头的正确标头
<?xml version="1.0" encoding="UTF-8"?>

这个xml在IE 6 7 8中完美呈现,但在IE9中不起作用。 我不确定它是否与Quirks模式相关的问题,如果是,我不确定DOCTYPE应该用于XML文档。 任何帮助将不胜感激。 以下是XML文档的前几行。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/mobiledoc/jsp/empi/master/CCD.xsl" ?>
<ClinicalDocument xmlns="urn:hl7-org:v3" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns:sdtc="urn:hl7-org:sdtc" 
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  xsi:schemaLocation="urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd" 
                  classCode="DOCCLIN" 
                  moodCode="EVN">

3 个答案:

答案 0 :(得分:2)

你能更具体地说明它“在IE9上甚至没有被识别为xml”吗?您是否收到错误消息,或者只是在IE9中看起来与以前的版本不同?

您的XML文件所做的第一件事就是将自己与“/mobiledoc/jsp/empi/master/CCD.xsl”中的XSLT样式表相关联,因此这可能是您问题的根源。一些建议:

  • 作为测试,删除<?xml-stylesheet .. ?>位。您现在在所有浏览器中都获得相同的行为吗? (可能只是XML文件的分层视图)如果是这样,那么问题出在您的XSLT样式表中。

  • 该样式表有什么作用?如果它将XML文件转换为HTML,它可能正在使用IE的旧版本容忍的一些不符合(X)HTML构造或样式,但IE9更严格。如果“无法识别”是某些布局/显示问题,调整样式表可能会修复您在浏览器中看到的内容。

根据你到目前为止告诉我们的内容,我认为这可能是你需要开始的地方。

ETA:下面对话的结果是<xsl:output>指令强制将4.01 HTML doctype输入到输出中;将此更改为<xsl:output method="html"/>(并修复了转换中的其他几个问题)修复了IE9中的问题。

答案 1 :(得分:1)

我很高兴这个问题得到解决 - 在这个特殊情况下是这样的 但IE9错误的真正原因还没有透露,所以我会在这里做。

遇到行为的原因是IE9中的XSLT处理中的错误

好吧 - 这不是一个错误,只是糟糕的错误报告。关键是IE9默认使用MSXML6,并且很多事情都改变了MSXML4。当XSLT中出现明显错误时,它没有报告 - IE9似乎跳过处理到默认文本()模板,这导致呈现所有文本节点。
更糟糕的是,当在MSSLML6中默认禁止的XSLT中完成某些操作时,会发生同样的事情。那么MSXML6中默认禁止的是什么?很多!以Jscript为例。和DTD的。而document()函数将无法正常工作。

在上面的例子中,人们可能会怀疑显示的文本(显然来自应用默认模板),xslt中存在错误 - 等待用好工具发现。但是,当打开文件的xml部分中没有文本时(即,当xslt本身提供要处理的所有数据时,例如通过在运行时导入xml文件,或者xslt),这种IE9行为与xslt没有明显关联。 xslt处理的xml中的数据全部属于属性和节点名称。你只需要知道......

如果您通过按F12(或从“工具”菜单中选择它)转到开发人员工具,您可以自己查看所有这些背后的错误消息。在开发人员工具子屏幕中,选择“脚本菜单”并立即加载页面。您将在右侧的控制台中看到一条错误消息:
XSLT8690: XSLT processing failed.
发生此错误时,仅显示xml中的文本节点(因此,对于空的xml根节点,页面将为空白。)
我只能在网上找到一个对此错误的引用:http://www.wikistep.org/bugzilla/show_bug.cgi?id=4140

请注意,当您通过单击刷新按钮旁边的撕裂页面按钮选择“兼容性视图”(这并不总是可用,另一个是-minor-IE9错误)时,页面将返回到IE8显示,并且可以正常再次 - 好吧,除了xslt中的任何错误当然,但MSXML 4.0没有MSXML 6.0默认具有的所有这些限制。它确实更安全,但也非常烦人。

请注意,通过选择兼容性视图,文件网址的网站部分会添加到自动应用兼容性视图的网站列表中。
要重新创建此问题,您必须从该列表中删除该网站,方法是按Alt键打开菜单,选择工具/兼容性视图设置,然后再次尝试从列表中删除该网站。
另请注意,应用兼容性视图的技巧并不总能解决问题:例如,当xslt调用包含IE8 Jscript版本中不可用的类的嵌入式javascript时,xslt也会在兼容性视图中失败。

现在可以做些什么呢?其实我不确定 - 值得关于SO的另一个问题! 默认情况下关闭的属性可以打开 - 但是我看到的例子只在一个语句序列中的DOM对象中加载XML类型字符串时才这样做 - 然后可以在之前为新DOM对象分配必要的属性加载字符串。
在这里,IE9负责自动加载XML,并加载XSLT来处理XML。那么在加载发生之前我们可以设置XML加载属性呢? 我相信这需要时间 - 但我会发现!

答案 2 :(得分:0)

当您使用xslt函数ex document('../_data/nav.xml')/page:nav | document('http://www.ok.kz/_data/nav.xml')/page:nav时,如果它指向另一台服务器,它将无法呈现您的文档,无需解释,只需空白页或xml作为文本