【问题标题】:optional use of xsl stylesheet可选择使用 xsl 样式表
【发布时间】:2026-01-31 04:15:01
【问题描述】:

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

【问题讨论】:

    标签: xml xslt xhtml


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      假设如下:

      1. $stylesheet-to-import 是要导入的样式表的参数/变量。如果它可以被 XSLT 引擎定位,它可以是短格式,否则它应该与 $uri-of-stylesheet-to-import 相同
      2. $uri-of-stylesheet-to-import 是要导入的样式表的 uri(如果存在)。
      3. 如果 $uri-of-stylesheet-to-import 指向的文件存在,那么它是一个有效的 xslt 文件。

      我认为这个解决方案只适用于 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 时,它会变慢,这取决于您的问题,这可能是一件好事,也可能不是一件好事。

      【讨论】:

      • 这是否意味着我可以在我的 xml 文件中使用 xsl 导入语句作为一行,这样如果 xml 文件被移动,将对关联(导入)样式表进行检查?如果样式表存在,它将很好地呈现,但如果未找到样式表,它将仅显示为原始 xml?
      • 这行不通。浏览器只支持 XSLT 1.0,它没有 use-when。并且 href 属性必须是硬编码的,无论是在 1.0 还是 2.0 中。投反对票。