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

时间:2008-09-26 21:20:35

标签: xml xslt vbscript client-scripting

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

7 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

......有一个领先的斜线?

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

第一次尝试:

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

最终解决方案:

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

答案 6 :(得分:-1)

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

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

或者如果你有XML中的值,

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