xsl:import 或 xsl:include 的相对路径
-
02-07-2019 - |
题
我正在尝试使用 VBScript 对 XML 对象进行 XSLT 转换。
我正在翻译的 XSL 文件包括 <xsl:import href="script.xsl"/>
指示。如果我使用绝对 URL (http://localhost/mysite/script.xsl
),它导入了样式表;但是,如果我使用相对路径(script.xsl
)它报告“找不到资源”。我需要能够在一组计算机中移植它,因此我需要能够使用相对的URI。有什么建议么?
笔记:
- VBScript 文件位于
http://localhost/myscript.asp
- 第一个 XSL 文件位于
http://localhost/mysite/styles.xsl
- 第二个 XSL 文件位于
http://localhost/mysite/script.xsl
- 使用相对路径
mysite/script.xsl
也不起作用
附录:
谢谢大家的回答。我越深入研究执行此操作的代码,就越感到陌生。 myscript.asp
是一个相当不寻常的代码编译。发生的情况是 styles.xsl
包含在 HTML 输出中 myscript.asp
作为 XML 块(<xml src=...>
),然后使用 VBScript 在客户端将该块作为样式表加载。然后,该样式表用于转换通过 XMLHTTP 检索的 XML 块。所以问题是上下文 styles.xsl
是客户端的HTML,与哪里无关 script.xsl
是。
解决方案 6
第一次尝试:
我尝试将 script.xsl 作为另一个 xml 块包含进来,并以我能想象到的各种方式更改导入语句,但没有成功。
最终解决方案:
由于包含 script.xsl 的绝对 url 从一开始就起作用,因此我的最终解决方案是将 style.xsl 转换为具有正确文档类型的 style.asp。然后,在这个文件中,我能够检索服务器名称、协议和路径,并使用 asp 将它们回显到导入语句中的正确位置。然后,当该文件包含在 mysscript.asp 中时,它就具有服务器的正确绝对 URL。这是一个有点黑客,但我发现解决这个相当复杂的情况的唯一方法。
其他提示
xsl:import、xsl:include 和 document() 函数的当前目录是包含使用它们的转换的目录。因此,您所说的您正在使用的 xsl:import 指令应该可以正常工作。
我能想到的唯一可能会影响这个的事情:如果使用相对路径,则直接从文件系统读取文件,而如果使用绝对 URI,则从 Web 服务器检索文件。是否有可能存在某些安全设置阻止脚本读取此目录中的文件?
@Jon我认为你非常接近......但不应该是...
<xsl:import href="/mysite/script.xsl"/>
...带有前导斜杠?
我会通过跑步来解决这个问题 系统内部进程监视器. 。运行此工具后,您实际上可以看到脚本尝试打开哪些文件,即使它们不存在。
相对路径的“当前目录”是否可能是 ASP 页面的位置,而不是 XSL 文件的位置?换句话说,如果您还没有这样做,您可以尝试:
<xsl:import href="mysite/script.xsl"/>
我经常遇到这个问题,因为有一个我看不到的库正在使用一个自定义 URI 解析器(或者不知道,因为我没有阅读相关文档。)我不记得这是规范还是不是,但在 Saxon/java 世界中,自定义 URI 解析器首先尝试解析包含/导入语句以及 document() 函数的 URI。如果它无法解析 URI,默认的 URI 解析器会尝试一下,当 URI 是绝对的时,通常不会错过。
因此,ASP 引擎中可能使用基于应用程序上下文的上下文驱动的 URI 解析器。
加载 JS、图像或 CSS 文件时,您需要一个定义 approot 或 webroot 的变量。
<xsl:import href="{$approot}/somedir/script.xsl"/>
或者如果您有 XML 中的值,
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>