xsl:import或者xsl:include的相对路径
我正在尝试使用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的HTML输出中(<xml src = ...>`),然后使用VBScript将该块作为样式表加载到客户端。然后,此样式表用于转换通过XMLHTTP检索的XML块。因此,问题在于" styles.xsl"的上下文是客户端上的HTML,与" script.xsl"的位置无关。
解决方案
出于相对路径的目的,"当前目录"是否可能是ASP页的位置,而不是XSL文件?换句话说,如果我们还没有尝试过,可以尝试:
<xsl:import href="mysite/script.xsl"/>
xsl:import,xsl:include和document()函数的当前目录是包含使用它们的转换的目录。因此,我们已经说过使用的xsl:import指令应该可以正常工作。
我唯一想到的可能会影响到这一点:如果使用相对路径,则直接从文件系统读取文件,而如果使用绝对URI,则将从Web服务器检索该文件。是否有某些安全设置阻止脚本读取此目录中的文件?
@乔恩,我想你很亲近,但不应该如此。
<xsl:import href="/mysite/script.xsl"/>
...以斜杠开头?
我经常遇到这个问题,因为一个看不见的库正在使用一个自定义URI解析器(或者因为我没有阅读相关的文档而不知道)。我不记得这是规范还是标准。而不是在Saxon / java世界中,自定义URI解析器首先尝试为包含/导入语句以及document()函数解析URI。如果无法解析URI,则使用默认的URI解析器尝试一下,当URI为绝对值时,它通常不会丢失。
因此,可能是ASP引擎中使用了基于应用程序上下文的上下文驱动的URI解析器。
在加载JS,Image或者CSS文件时,我们需要一个变量来定义approot或者webroot。
<xsl:import href="{$approot}/somedir/script.xsl"/>
或者如果我们在XML中具有值,
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>
我将通过运行Sysinternals Process Monitor来解决此问题。使用此工具,我们实际上可以查看脚本尝试打开的文件,即使它们不存在。
第一次尝试:
我尝试将script.xsl作为另一个xml块包含在内,并以我能想到的所有方式更改了import语句,但没有成功。
最终解决方案:
由于包含script.xsl的绝对URL从一开始就起作用,所以我的最终解决方案是使用正确的doctype将style.xsl转换为style.asp。然后,在此文件中,我可以使用asp检索服务器名称,协议和路径,并将它们回显到import语句中的正确位置。然后,当此文件包含在mysscript.asp中时,它具有服务器的正确绝对URL。这有点骇人听闻,但我发现解决这种令人费解的情况的唯一方法。