XSL 样式表的可选使用

optional use of xsl stylesheet

提问人:Man Wa kileleshwa 提问时间:5/23/2012 更新时间:5/23/2012 访问量:414

问:

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

XML xslt xhtml

评论


答:

-1赞 Sean B. Durkin 5/23/2012 #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 的配置(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 引擎可以这样定位它,则可以是缩写形式,否则它应该与 stylesheet-to-import 的$uri相同
  2. $uri-of-stylesheet-to-import 是要导入的样式表的 URI(如果存在)。
  3. 如果 $uri-of-stylesheet-to-import 指向的文件存在,则它是有效的 xslt 文件。

我认为此解决方案仅适用于 XSLT 2.0。我不确定 XSLT 1.0。

另请阅读 Dimitre 对这个类似问题的回答:如何使用 XSL 检查是否存在外部文件?

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

评论

0赞 Man Wa kileleshwa 5/23/2012
这是否意味着我可以将 XSL IMPORT 语句用作 XML 文件中的一行,以便在 XML 文件四处移动时,将对关联的(导入的)样式表进行检查?如果样式表存在,它将很好地呈现,但如果找不到样式表,它将仅显示为原始 xml?
1赞 Michael Kay 5/23/2012
这是行不通的。浏览器仅支持 XSLT 1.0,它没有 use-when。并且 href 属性必须是硬编码的,无论是在 1.0 还是 2.0 中。投反对票。
0赞 Michael Kay 5/23/2012 #2

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

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