Xml xsl:import或xsl:include的相对路径
我正在尝试使用VBScript对XML对象进行XSLT转换。Xml xsl:import或xsl:include的相对路径,xml,xslt,vbscript,client-side,Xml,Xslt,Vbscript,Client Side,我正在尝试使用VBScript对XML对象进行XSLT转换。 我正在翻译的XSL文件包括指令。如果我使用绝对URL(http://localhost/mysite/script.xsl),它精细地导入样式表;但是,如果我使用相对路径(script.xsl),它会报告“未找到资源”。我需要能够在一组机器之间进行移植,因此我需要能够使用相对URI。有什么建议吗 注: VBScript文件位于http://localhost/myscript.asp 第一个XSL文件位于http://localho
我正在翻译的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
是一种相当不寻常的代码编译。发生的是样式。xsl
作为XML块(
)包含在myscript.asp
的HTML输出中,然后在客户端使用VBScript将该块作为样式表加载。然后使用此样式表转换通过XMLHTTP检索的XML块。因此问题在于样式的上下文。xsl
是客户端的HTML,与脚本.xsl
的位置无关。相对路径中的“当前目录”是否可能是ASP页面的位置,而不是xsl文件?换句话说,如果您还没有,您可以尝试:
<xsl:import href="mysite/script.xsl"/>
xsl:import、xsl:include和document()函数的当前目录是包含使用它们的转换的目录。因此,您所说的xsl:import指令应该是有效的
我能想到的唯一一件事可能会影响这一点:如果使用相对路径,文件将直接从文件系统读取,而如果使用绝对URI,则将从web服务器检索。有没有可能有某种安全设置阻止脚本读取此目录中的文件?@Jon我想你很接近了。。。但它不应该是
<xsl:import href="/mysite/script.xsl"/>
…使用前导斜杠?我经常遇到这个问题,因为我看不到(或者因为没有阅读相关文档而不知道)库正在使用自定义URI解析器。我不记得这是不是规范,但在Saxon/java世界中,在尝试解析include/import语句以及document()函数的URI时,自定义URI解析器首先受到攻击。如果它不能解析URI,默认的URI解析程序会给它一次尝试,当URI为绝对值时,通常不会错过
因此,可能是ASP引擎中使用了基于应用程序上下文的上下文驱动URI解析器 加载JS、Image或CSS文件时,需要一个定义approt或webroot的变量
<xsl:import href="{$approot}/somedir/script.xsl"/>
或者如果XML中有值
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>
我会通过跑步来解决这个问题。运行此工具后,您实际上可以看到脚本试图打开的文件,即使这些文件不存在 第一次尝试: 我尝试将script.xsl作为另一个xml块,并以我能想象到的任何方式更改import语句,但没有成功 最终解决方案:
由于包含script.xsl的绝对url从一开始就起作用,因此我的最终解决方案是使用正确的doctype将style.xsl转换为style.asp。在这个文件中,我能够检索服务器名称、协议和路径,并使用asp将它们回送到导入语句的正确位置。然后,当这个文件包含在mysscript.asp中时,它具有服务器的正确绝对url。这有点像黑客,但这是我发现的解决这一相当复杂问题的唯一方法。有没有可能发布myscript.asp的代码?myscript.asp是否位于或?中引用了此问题:它不适用于xsl:import,它适用于或等常规元素。