6

我正在尝试使用 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是一个相当不寻常的代码编译。发生的情况是作为 XML 块 ( )styles.xsl包含在 HTML 输出中,然后在客户端使用 VBScript 将该块作为样式表加载。然后使用此样式表转换通过 XMLHTTP 检索的 XML 块。所以问题是客户端的 HTML 的上下文与位置无关。myscript.asp<xml src=...>styles.xslscript.xsl

4

7 回答 7

1

xsl:import、xsl:include 和 document() 函数的当前目录是包含使用它们的转换的目录。因此,您所说的 xsl:import 指令应该可以正常工作。

我唯一能想到的可能会影响这一点:如果您使用相对路径,则文件将直接从文件系统中读取,而如果您使用绝对 URI,则将从 Web 服务器中检索文件。是否有一些安全设置阻止脚本读取此目录中的文件?

于 2008-09-27T02:07:58.540 回答
1

@Jon我认为你很接近......但不应该......

<xsl:import href="/mysite/script.xsl"/>

...带前导斜线?

于 2008-10-02T20:36:12.063 回答
1

我会通过运行Sysinternals Process Monitor来解决这个问题。运行此工具后,您实际上可以查看脚本尝试打开的文件,即使它们不存在。

于 2009-01-23T20:56:58.237 回答
0

出于相对路径的目的,“当前目录”是否可能是您的 ASP 页面的位置,而不是您的 XSL 文件?换句话说,如果您还没有,您可以尝试:

<xsl:import href="mysite/script.xsl"/>
于 2008-09-26T21:30:32.000 回答
0

我经常遇到这个问题,因为我看不到的库正在使用自定义 URI 解析器(或者因为我没有阅读相关文档而不知道。)我不记得这是规范还是不是,但在 Saxon/java 世界中,自定义 URI 解析器首先尝试解析包含/导入语句的 URI 以及 document() 函数。如果它无法解析 URI,默认的 URI 解析器会尝试一下,当 URI 是绝对的时,通常不会错过。

因此,它可能是 ASP 引擎中使用基于应用程序上下文的上下文驱动的 URI 解析器。

于 2008-10-13T05:58:12.533 回答
0

第一次尝试:

我尝试将 script.xsl 包含为另一个 xml 块,并以我能想象到的各种方式更改导入语句,但没有成功。

最终解决方案:

由于包含 script.xsl 的绝对 url 从一开始就有效,我的最终解决方案是使用正确的文档类型将 style.xsl 转换为 style.asp。然后,在这个文件中,我能够检索服务器名称、协议和路径,并使用 asp 将它们回显到导入语句中的正确位置。然后,当这个文件被包含在 mysscript.asp 中时,它就有了正确的服务器绝对 URL。这有点小技巧,但我发现解决这个相当复杂的情况的唯一方法。

于 2009-12-22T18:46:58.777 回答
-1

在加载 JS、图像或 CSS 文件时,您需要一个定义 approot 或 webroot 的变量。

 <xsl:import href="{$approot}/somedir/script.xsl"/>

或者如果您在 XML 中有值,

 <xsl:import href="{/root/@approot}/somedir/script.xsl"/>
于 2008-10-13T13:55:32.587 回答