我正在尝试使用 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"/>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top