可选择使用xsl样式表

时间:2012-05-22 20:57:22

标签: xml xslt xhtml

我有一些xml文件,它们在Web浏览器中查看时使用XSL样式表对其进行格式化。我将xml文件保存在一个中央位置,这是我的任何同事都可以访问的共享驱动器。如果他们直接从共享位置打开XML文件,则会正确呈现,但有时他们会获取XML的副本,并且只获取他们需要的XML文件。当他们在浏览器中查看文件时,它无法找到XSL样式表,因此无法呈现。有没有办法说xsl样式表是否可用,请使用它,如果没有,那么只需忽略使用样式表并显示xml文件,就好像没有样式表一样。基本上这意味着在拍摄本地副本时不会出现错误。可以这样做吗

2 个答案:

答案 0 :(得分:0)

您可能依赖于<?xml-stylesheet?>处理指令。如果无法找到样式表,我不知道有什么方法可以参数化它的行为:我敢说它还取决于浏览器。

为什么不使用可以从网络上的任何位置获取样式表的绝对URI?您可能遇到跨站点脚本问题,但值得尝试。

答案 1 :(得分:-1)

我怀疑没有简洁的方法可以做到这一点。您可以在导入时使用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的配置中找到general.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) />

假设以下内容:

  1. $ stylesheet-to-import是要导入的样式表的参数/变量。它可以是简短形式,如果它可以由XSLT引擎定位,否则它应该与$ uri-of-stylesheet-to-import
  2. 相同
  3. $ uri-of-stylesheet-to-import是要导入的样式表的uri。
  4. 如果$ uri-of-stylesheet-to-import指向的文件存在,那么它是一个有效的xslt文件。
  5. 我认为此解决方案仅适用于XSLT 2.0。我不确定XSLT 1.0。

    另请阅读Dimitre对此类似问题的回答:How do I check for the existence of an external file with XSL?

    注意: 作为fn:unparsed-text-available()的替代方法,您还可以使用fn:doc-available()。它会检查文档是否是有效的XML会更慢,根据您的问题,这可能是也可能不是一件好事。