【问题标题】:Apply XSL to External XML将 XSL 应用于外部 XML
【发布时间】: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 xslt


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      如果您尝试在例如在命令行中,您可以使用一系列工具将 XSLT 文件应用于给定的 XML 文件——通常是在本地硬盘上的文件。

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

      希望这会有所帮助。

      马克

      【讨论】:

        【解决方案3】:

        使用“纯”xml+xslt(*) 无法实现这一点。一些外部代码需要识别 xml 和应该转换它的 xslt。

        由于您似乎在转换 XML,我猜您是在网络浏览器中执行此操作。

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

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

        【讨论】:

        • 这行不通,当 xml 为“我的域之外”时,他明确要求解决方案。 Javascript不做跨域。为什么他支持你的答案超出了我的理解,因为它显然是 100% 错误的,我才意识到在花了 20 分钟试图让这个例子工作之后......事实上,我想不出那个例子有任何用处,它仅适用于同一域中的文件,这些文件已经可以编辑......所以基本上我想说的是,这是错误的,我对此表示反对。
        • @Cody:很抱歉让您感到沮丧,我将更新答案以突出显示对 CORS 的要求。如果原始站点支持 CORS,您可能可以在 javascript 中执行此操作;否则你需要代理 XML。
        • @Cody:我曾经是一家公司的操作员,我们正在做一些程序。要知道我们是否可以继续,我们可以使用由合作伙伴组织填充的 XML 文件,但我们无权访问它,并且毫无疑问要求他们更改其中的任何内容。我们在这里等待一些具体信息,文件很长。我们希望只显示该特定标签的内容。因此,我们处于需要将 XSL 应用于外部 XML 文件的情况。问候。
        【解决方案4】:

        您可以编写一个本地 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,我没有尝试过其他版本)

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多