I have xml files which make use of an XSL stylesheet to format it when view in a web browser. I save the xml files in a central location, a shared drive which any of my colleagues can access. If they open an XML file directly from the shared location, it renders correctly, however sometimes they take a copy of the XML, and only the XML file that they need. when they view the file in a browser it fails to locate the XSL stylesheet and hence doesn't render. Is there a way to say if the xsl stylesheet is available, make use of it, if not then simply ignore using the stylesheet and display the xml file as if there were not stylesheet. Basically this would mean no error would be seen when a local copy is taken. Can this be done
2 回答
您可能依赖于<?xml-stylesheet?>
处理指令。如果找不到样式表,我不知道有什么方法可以参数化它的行为方式:我敢说它无论如何都取决于浏览器。
为什么不使用可以从网络上任何地方获取样式表的绝对 URI?您可能会遇到跨站点脚本问题,但值得一试。
我怀疑没有简洁的方法可以做到这一点。您可以像这样在导入时使用 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 目录、命令行参数、环境变量 - 随便什么。它是特定于供应商的)中在哪里可以找到 general.xslt。但是,相同的位置查找逻辑不适用于 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 引擎定位,它可以是短格式,否则它应该与 $uri-of-stylesheet-to-import 相同
- $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,这可能是也可能不是一件好事,具体取决于您的问题。