xsl:import 或 xsl:include 的相对路径

Relative path for xsl:import or xsl:include

提问人:alumb 提问时间:9/27/2008 最后编辑:Mathias Mülleralumb 更新时间:3/26/2014 访问量:24055

问:

我正在尝试使用 VBScript 对 XML 对象进行 XSLT 转换。
我正在翻译的 XSL 文件包含该指令。如果我使用绝对 URL (),它可以很好地导入样式表;但是,如果我使用相对路径(),它会报告“找不到资源”。我需要能够在一组机器之间移植它,所以我需要能够使用相对的 URI。有什么建议吗?
<xsl:import href="script.xsl"/>http://localhost/mysite/script.xslscript.xsl

笔记:

  • VBScript 文件位于http://localhost/myscript.asp
  • 第一个 XSL 文件位于http://localhost/mysite/styles.xsl
  • 第二个 XSL 文件位于http://localhost/mysite/script.xsl
  • 使用相对路径也不起作用mysite/script.xsl

补遗:

谢谢大家的回答。我越深入研究这样做的代码,它就越奇怪。 是一个相当不寻常的代码编译。发生的情况是以 XML 块 () 的形式包含在 HTML 输出中,然后在客户端使用 VBScript 将该块加载为样式表。然后,此样式表用于转换通过 XMLHTTP 检索的 XML 块。所以问题是 HTML 在客户端的上下文,与 where 无关。myscript.aspstyles.xslmyscript.asp<xml src=...>styles.xslscript.xsl

XML XSLT VBScript 客户端

评论

0赞 Kev 9/27/2008
有机会发布myscript.asp的代码吗?myscript.asp住在 localhost/myscript.asp 还是 localhost/mysite/myscript.asp
0赞 Gabriel Balsa Cantú 4/19/2018
此问题引用于:stackoverflow.com/questions/27785901/...

答:

0赞 Jon Schneider 9/27/2008 #1

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

<xsl:import href="mysite/script.xsl"/>
1赞 Robert Rossney 9/27/2008 #2

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

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

1赞 dacracot 10/3/2008 #3

@Jon我觉得你很亲近......但不应该是......

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

...用前斜杠?

0赞 jnellis 10/13/2008 #4

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

因此,ASP 引擎中的某些内容可能基于应用上下文使用上下文驱动的 URI 解析器。

-1赞 scunliffe 10/13/2008 #5

您需要一个变量来定义 approot 或 webroot 在加载 JS、Image 或 CSS 文件时。

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

或者,如果您在 XML 中有该值,

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

评论

0赞 astonia 12/6/2013
它不适用于 xsl:import,它适用于一般元素,例如 <style> 或 <javascript> 等。
1赞 Dominic Cronin 1/24/2009 #6

我将通过运行 Sysinternals 进程监视器来解决此问题。运行此工具后,您实际上可以看到脚本尝试打开哪些文件,即使它们不存在。

0赞 alumb 12/23/2009 #7

第一次尝试:

我尝试将script.xsl作为另一个xml块,并以我能想象到的所有方式更改import语句,但没有成功。

最终解决方案:

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