我要做的是拿一个XML文档,比方说http://example.org/data.xml并使用XSL样式表来显示它。 (我无法修改文档本身并添加指令)
所以有几个这样的实用XML文件:
wrapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY content SYSTEM "http://example.org/data.xml">
]>
<?xml-stylesheet type="text/xsl" href="unwrap.xsl" ?>
<wrapper>
&content;
</wrapper>
unwrap.xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="stylesheet.xsl"/>
<xsl:template match="/wrapper/node()[1]">
<xsl:apply-imports/>
</xsl:template>
</xsl:stylesheet>
总结一下:stylesheet.xsl是为http://example.org/data.xml编写的,浏览器指向wrapper.xml,用户应该看到转换后的http://example.org/data.xml。
这是少见的情况之一,其中IE(和Chrome)中的内容可以正常工作,但不是Firefox。
AFAIK Firefox支持外部XML实体,但似乎它们在XSL代码中不可见。我从2006年发现this article,它在Firefox 1.5中描述了这个问题(我使用的是3.5.3)
有没有解决方法呢?
答案 0 :(得分:1)
目前,由于安全性和拒绝服务问题,FireFox不会加载外部DTD和实体引用。例如:http://en.wikipedia.org/wiki/Billion_laughs
有一个开放的Mozilla bug描述了为什么以及是否要使其具有可配置性的原因和冗长的争论:https://bugzilla.mozilla.org/show_bug.cgi?id=22942
There does appear to be one workaround to loading DTDs ,但我猜这可能不是一个可行的解决方案。
Firefox将加载本地 DTD文件
如果你把它们放在Windows的这个目录中:
C:\Program Files\Mozilla Firefox\res\dtd\...
Linux目录:
/**mileage may vary**/MozillaFirefox/lib/res/dtd/
使用实体参考的一个想法: 如果您可以控制wrapper.xml的内容,那么您可以获取http://example.org/data.xml(服务器端)的内容并将其作为包装文件的完整内容进行回显,并添加样式表处理指令(假设你有一些动态的服务器端功能。)