我有一些xml文件,它们在Web浏览器中查看时使用XSL样式表对其进行格式化。我将xml文件保存在一个中央位置,这是我的任何同事都可以访问的共享驱动器。如果他们直接从共享位置打开XML文件,则会正确呈现,但有时他们会获取XML的副本,并且只获取他们需要的XML文件。当他们在浏览器中查看文件时,它无法找到XSL样式表,因此无法呈现。有没有办法说xsl样式表是否可用,请使用它,如果没有,那么只需忽略使用样式表并显示xml文件,就好像没有样式表一样。基本上这意味着在拍摄本地副本时不会出现错误。可以这样做吗
答案 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) />
假设以下内容:
我认为此解决方案仅适用于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会更慢,根据您的问题,这可能是也可能不是一件好事。