目前我使用:
<?xml-stylesheet type="text/xsl" href="XSL.xsl"?>
将XSL链接到XML。
如果我的xml在这里:www.externaldomain.com/rss.xml(在我的域之外)我怎样才能将XSL链接到XML?
我可以将XSL指向文件或链接吗?
答案 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/获取。