1

我想要做的是获取一个 XML 文档,比如说http://example.org/data.xml并使用 XSL 样式表显示它。(我无法修改文档本身并添加指令)

所以有几个像这样的实用 XML 文件:

包装器.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>

展开.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 年发现这篇文章,它描述了 Firefox 1.5 中的这个问题(我使用的是 3.5.3)

有什么解决方法吗?

4

1 回答 1

1

XML 看起来很熟悉;)

目前,出于安全和拒绝服务的考虑,FireFox 不会加载外部 DTD 和实体引用。例如:http ://en.wikipedia.org/wiki/Billion_laughs

有一个开放的Mozilla 错误描述了原因和关于是否使其成为可配置的东西的冗长辩论:https ://bugzilla.mozilla.org/show_bug.cgi?id=22942

加载 DTD 似乎有一种解决方法但我猜这对您来说可能不是一个可行的解决方案

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(服务器端)的内容并将其作为包装文件的全部内容,加上样式表处理指令(假设您有一些动态的服务器端功能)。

于 2009-10-03T17:49:19.087 回答