【发布时间】:2009-09-27 15:11:11
【问题描述】:
目前我使用:
<?xml-stylesheet type="text/xsl" href="XSL.xsl"?>
将 XSL 链接到 XML。
如果我的 xml 在这里:www.externaldomain.com/rss.xml(在我的域之外)我怎样才能将 XSL 链接到 XML?
我可以将 XSL 指向文件或链接吗?
【问题讨论】:
目前我使用:
<?xml-stylesheet type="text/xsl" href="XSL.xsl"?>
将 XSL 链接到 XML。
如果我的 xml 在这里:www.externaldomain.com/rss.xml(在我的域之外)我怎样才能将 XSL 链接到 XML?
我可以将 XSL 指向文件或链接吗?
【问题讨论】:
您可以通过实体引用创建包含远程 XML 文件的 XML 内容的本地 XML 文件。
下面的示例将为您提供 wrapper 文档元素内的远程 XML 文件的内容。
然后,您可以在本地 XML 文件中包含样式表处理指令。
但是,由于本地文件有一个 wrapper 文档元素,您可能需要指向一个使用 xsl:import 来导入原始 XSL 的“wrapper XSLT” .xsl 和 apply-templates 从 wrapper 元素内的内容开始。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY content SYSTEM "http://stackoverflow.com/feeds">
]>
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?>
<wrapper>
&content;
</wrapper>
【讨论】:
如果您尝试在 .NET 中运行 XSLT,您可以轻松地使用 .NET 中的 XslCompiledTransform 类来实现这一点。
如果您尝试在例如在命令行中,您可以使用一系列工具将 XSLT 文件应用于给定的 XML 文件——通常是在本地硬盘上的文件。
参见例如Oleg Tkachenko 的 info on NXSLT 和其他 XSLT 工具的网站,或查看 CodeProject article 的 Windows shell 扩展以将 XSLT 应用于给定的 XML 文件(在本地硬盘上)。
希望这会有所帮助。
马克
【讨论】:
使用“纯”xml+xslt(*) 无法实现这一点。一些外部代码需要识别 xml 和应该转换它的 xslt。
由于您似乎在转换 XML,我猜您是在网络浏览器中执行此操作。
您可以使用 javascript 来执行此操作,例如 demonstrated on w3schools。但是,如果您正在执行基于 javascript 的请求(即 AJAX/XHR),跨域限制仍然适用:如果源服务器未设置适当的 CORS 标头以允许跨域 javascript 访问,则您需要代理该 xml 请求通过您自己的服务器。
(*): Mad's answer 使用实体引用巧妙地将外部 xml 嵌入到包含文档中。绝对值得一试,但请注意,这种基于实体的包含已在多个信息披露泄漏中使用,这就是为什么在 xml 解析器中通常不启用它的原因(特别是,这不应该能够颠覆浏览器中的 CORS)。你只需要在你的情况下尝试一下。
【讨论】:
您可以编写一个本地 xml 文件作为包装器:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?>
<wrapper Source="http://www.externaldomain.com/rss.xml"/>
并扩展您的样式表,以便它理解包装器:
<xsl:template match="wrapper">
<xsl:apply-templates select="document(./@Source)"/>
</xsl:template>
我没有通过 http 使用 XML 文件对其进行测试,但它适用于我不想更改以包含 xml-stylesheet 处理指令的本地 XML 文件。它适用于Firefox,Opera和IE(7,我没有尝试过其他版本)
【讨论】:
一个解决方案: 将外部 XML 获取到 XMLDocument 对象中,然后插入一个包含 xsl 的 include 语句的节点。 include xsl 可以取自http://adityabajaj.com/weblog/include-xsl-in-x-ml/。
【讨论】: