提问人:Man Wa kileleshwa 提问时间:5/23/2012 更新时间:5/23/2012 访问量:414
XSL 样式表的可选使用
optional use of xsl stylesheet
问:
我有xml文件,当在Web浏览器中查看时,它使用XSL样式表来格式化它。我将 xml 文件保存在一个中心位置,一个共享驱动器,我的任何同事都可以访问。如果他们直接从共享位置打开 XML 文件,则该文件会正确呈现,但有时他们会获取 XML 的副本,并且只获取所需的 XML 文件。当他们在浏览器中查看文件时,它无法找到 XSL 样式表,因此不会呈现。有没有办法说 xsl 样式表是否可用,使用它,如果没有,那么只需忽略使用样式表并显示 xml 文件,就好像没有样式表一样。基本上,这意味着在获取本地副本时不会看到任何错误。这能做到吗
答:
我怀疑没有巧妙的方法可以做到这一点。您可以在导入时使用 use-when 属性,如下所示......
<xsl:import
xmlns:fn="http://www.w3.org/2005/xpath-functions"
href="'general.xslt'"
use-when="fn:unparsed-text-available( 'general.xslt') />
上面的元素将导入样式表“general.xslt”(如果存在)。此解决方案的问题/限制在于,对于 @href 属性,XSLT 知道在哪里可以找到 xslt 的配置(OASIS 目录、命令行参数、环境变量 - 等等。它是特定于供应商的)。但是,相同的位置查找逻辑不适用于 unparsed-text-available(),它采用 URI 参数。
因此,您可能希望像这样对上述元素进行参数化...
<xsl:import
xmlns:fn="http://www.w3.org/2005/xpath-functions"
href="$stylesheet-to-import"
use-when="fn:unparsed-text-available( $uri-of-stylesheet-to-import) />
其中假设如下:
- $stylesheet-to-import 是要导入的样式表的参数/变量。如果 XSLT 引擎可以这样定位它,则可以是缩写形式,否则它应该与 stylesheet-to-import 的$uri相同
- $uri-of-stylesheet-to-import 是要导入的样式表的 URI(如果存在)。
- 如果 $uri-of-stylesheet-to-import 指向的文件存在,则它是有效的 xslt 文件。
我认为此解决方案仅适用于 XSLT 2.0。我不确定 XSLT 1.0。
另请阅读 Dimitre 对这个类似问题的回答:如何使用 XSL 检查是否存在外部文件?
注意: 作为 fn:unparsed-text-available() 的替代方法,您还可以使用 fn:doc-available()。它会更慢,因为它会检查文档是否是有效的 XML,这可能是一件好事,也可能不是一件好事,具体取决于您的问题。
评论
您可能依赖于处理指令。如果找不到样式表,我不知道有什么方法可以参数化它的行为方式:我敢说无论如何这取决于浏览器。<?xml-stylesheet?>
为什么不使用一个绝对 URI,它可以从网络上的任何位置获取样式表呢?您可能会遇到跨站点脚本问题,但值得一试。
评论