我有一些XML需要使用多个XSL文件转换为HTML。这些XSL文件通过xsl:import和xsl:include语句相关联,而且所有文件都需要才能完成转换。
我知道XSL有效,因为在预先创建的XML文件中使用<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
指令,在浏览器打开该文件可以显示所需的输出结果。问题是,我想在动态生成的XML上复制此功能。
我看到有两种可能的解决方法,但似乎都有限制,我无法解决。
第一种解决方案是使用JavaScript转换XML。据我所知,这将需要使用XSLTProcessor对象加载多个XSL文件,但Chrome(以及其他浏览器)对xsl:import支持不好 - http://code.google.com/p/chromium/issues/detail?id=8441
我也尝试将XML写入iFrame或新窗口,但<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
指令在结果窗口中被注释掉了。实际上,任何写入新窗口的内容都是HTML - 我没有找到将XML写入新窗口的方法。
那么,如何使浏览器窗口显示使用一组XSL文件转换的XML文件的结果呢?
更新
因此,这是我对该问题的研究结果。
可能的解决方法:使用emscripten将诸如xsltproc之类的工具编译为JavaScript。我实际上已经做到了 - 参见https://github.com/mcasperson/xsltproc.js
问题: 在Firefox中速度非常慢(在Chrome中需要5秒的操作,在Firefox中需要30秒以上),并且无法在Chrome Web Worker中运行代码 - https://code.google.com/p/chromium/issues/detail?id=252492
可能解决方法: 完全不使用XSL,而是使用CSS样式表显示XML。
问题: 直到浏览器开始实现css attr(attribute name, url)
函数,否则没有办法将XML属性中的文件引用视为除字符串外的任何内容,这使得无法显示图像。
可能解决方法: 将所有XSL文件合并成一个样式表
问题: 这在某种程度上是可能的(参见Merge multiple xslt stylesheets),但是xsl:import和xsl:include具有特定的语义,当仅仅替换一个文件的内容以代替xsl:import或xsl:include语句时,这些语义无法传递。对于分成多个文件的大型XSL变换,该解决方案需要大量手动工作。
可能解决方法: 将XML内容写入iframe或新窗口。
问题: 不可能将XML写入新窗口或iframe。这些元素中写入的内容始终被假定为HTML,并插入到HTML->BODY元素中。
可能解决方法: 创建一个服务器端服务,接受XML,然后返回带有XSL样式表指令的XML。该服务URL可以用作iframe或新窗口的src
属性。
问题: 该服务必须是GET端点,这意味着要返回的XML必须包含为查询参数,这意味着您最终会遇到URL长度的问题。
可能的解决方法: 使用JavaScript XSL库,例如Saxonica CE。
问题: 这种方法可能有效(我没有尝试过),但是Saxonica CE不是开源的(这是我们项目的要求之一)。