将XSL应用于外部XML

时间:2009-09-27 15:11:11

标签: xml xslt

目前我使用:

<?xml-stylesheet type="text/xsl" href="XSL.xsl"?>

将XSL链接到XML。

如果我的xml在这里:www.externaldomain.com/rss.xml(在我的域之外)我怎样才能将XSL链接到XML?

我可以将XSL指向文件或链接吗?

5 个答案:

答案 0 :(得分:14)

您可以通过实体引用创建包含远程XML文件的XML内容的本地XML文件。

下面的示例将为您提供包装器文档元素中的远程XML文件的内容。

然后,您可以在本地XML文件中包含样式表处理指令。

但是,由于本地文件具有包装器文档元素,您可能需要指向使用 xsl:import 导入原始XSL的“包装器XSLT” .xsl和 apply-templates 包装元素内的内容开始。

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

答案 1 :(得分:3)

如果您尝试在.NET中运行XSLT,则可以轻松地使用.NET中的XslCompiledTransform类来实现此目的。

如果你试图在例如在命令行中,您可以使用大量工具将XSLT文件应用于给定的XML文件 - 通常是本地硬盘上的文件。

参见例如Oleg Tkachenko的info on NXSLT网站和其他XSLT工具,或者请参阅此CodeProject article以获取Windows外壳扩展,以将XSLT应用于给定的XML文件(在本地硬盘上)。

希望这有点帮助。

马克

答案 2 :(得分:2)

使用“纯”xml + xslt(*)无法实现此目的。一些外部代码需要识别xml和xslt,它们应该对其进行转换。

由于您似乎正在转换XML,我猜你会在Web浏览器中这样做。

您可以使用javascript执行此操作,demonstrated on w3schools。但是,如果您正在执行基于javascript的请求(即AJAX / XHR),跨域限制仍然适用:如果原始服务器未设置适当的CORS标头以允许跨域JavaScript访问,则您需要代理通过您自己的服务器请求xml。

(*):Mad's answer使用实体引用巧妙地将外部xml嵌入到包含文档中。这绝对值得一试,但请注意,这种基于实体的包含已用于多个信息泄露泄漏,这就是为什么它通常没有在xml解析器中启用(特别是,这不应该能够颠覆浏览器中的CORS)。你只需要在你的情况下尝试它。

答案 3 :(得分:2)

您可以将本地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文件,包括xml-stylesheet处理指令。它适用于Firefox,Opera和IE(7,我还没有尝试过其他版本)

答案 4 :(得分:0)

一个解决方案: 将外部XML获取到XMLDocument对象中,然后插入包含xsl的include语句的节点。包含xsl可以从http://tipscow.com/how-to-include-xsl-in-xml/获取。