提问人:alumb 提问时间:9/27/2008 最后编辑:Mathias Mülleralumb 更新时间:3/26/2014 访问量:24055
xsl:import 或 xsl:include 的相对路径
Relative path for xsl:import or xsl:include
问:
我正在尝试使用 VBScript 对 XML 对象进行 XSLT 转换。
我正在翻译的 XSL 文件包含该指令。如果我使用绝对 URL (),它可以很好地导入样式表;但是,如果我使用相对路径(),它会报告“找不到资源”。我需要能够在一组机器之间移植它,所以我需要能够使用相对的 URI。有什么建议吗?<xsl:import href="script.xsl"/>
http://localhost/mysite/script.xsl
script.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.asp
styles.xsl
myscript.asp
<xml src=...>
styles.xsl
script.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 世界中,自定义 URI 解析器在尝试解析 include/import 语句以及 document() 函数的 URI 时首先破解。如果它无法解析 URI,则默认 URI 解析器会尝试它,当 URI 为绝对值时,它通常永远不会错过。
因此,ASP 引擎中的某些内容可能基于应用上下文使用上下文驱动的 URI 解析器。
您需要一个变量来定义 approot 或 webroot 在加载 JS、Image 或 CSS 文件时。
<xsl:import href="{$approot}/somedir/script.xsl"/>
或者,如果您在 XML 中有该值,
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>
评论
我将通过运行 Sysinternals 进程监视器来解决此问题。运行此工具后,您实际上可以看到脚本尝试打开哪些文件,即使它们不存在。
第一次尝试:
我尝试将script.xsl作为另一个xml块,并以我能想象到的所有方式更改import语句,但没有成功。
最终解决方案:
由于包含 script.xsl 的绝对 url 从一开始就有效,因此我的最终解决方案是将 style.xsl 转换为具有正确 doctype 的 style.asp。在这个文件中,我能够检索服务器名称、协议和路径,并使用 asp 将它们回显到 import 语句中的正确位置。然后,当此文件包含在mysscript.asp中时,它具有服务器的正确绝对 URL。这有点黑客,但我发现解决这个相当复杂的情况的唯一方法。
评论