XML文件中本地XSL引用

3

首先是一个简短的任务描述:

有一个 XML 文件,引用了一个在 *.dll 中的 xsl 样式表。 这个 XML 的开头如下:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type='text/xsl' href='res://name_xsl.dll/frameset.xsl'?>

这个 XML 文件可以在 Internet Explorer 中打开并显示为 HTML,只有 IE 可以。 (xsl 将 xml 转换为 html)

正如您所看到的,它引用了win32系统文件夹,其中保存了 dll 文件。 使用 "res://" 引用可以工作。

但现在我不想将我的 dll 存储在系统文件夹中,而是存储在另一个文件夹中,比如 %ALLUSERSPROFILE%(环境变量),例如在 Windows XP 上是 C:\Documents and Settings\All Users,Win7 上是 C:\Users\Public(我不确定这一点)。

我该如何引用位于那个文件夹中的 dll? 是否可以使用环境变量来做到这一点,使其与系统无关? 您推荐什么解决方案。 (所有的 html、xsl 数据都保存在本地计算机的 dll 中。)

到目前为止,我已经尝试将参考行更改为以下内容:<?xml-stylesheet type='text/xsl' href='file:///c:/Documents and Settings/All Users/name_xsl.dll/frameset.xsl'?> 我还尝试了使用根文件夹 c: 甚至不带绝对路径,在同一个文件夹中拥有所有文件(xml 和 dll)。所有尝试都没有 res:// 结果,导致出现以下错误消息:系统无法找到指定的资源。处理资源时出错 'file:///C:/Documents and Settings/All Users/name_xsl.dll/... 或 'file:///C:/name_xsl.dll/frameset.xsl'。你能帮我吗?为什么它找不到文件?(文件名是虚构的)

如果您无法正确呈现XML,请尝试以下方法:https://stackoverflow.com/questions/49687472/how-to-use-a-relative-path-in-xml-for-xsl-stylesheet/69150280#69150280 - Alvin Smith
1个回答

1

这是解决方案:

<?xml-stylesheet type='text/xsl' href='res://C:%5CDocuments and Settings%5CAll Users%5Cname_xsl.dll/frameset.xsl'?>

注意:

  1. 您必须使用res://协议来访问文件中的资源。
  2. 文件系统反斜杠可以编码为%5C。可能正斜杠也可以工作。

示例: 我已经测试了file://协议的示例,但它应该与res:协议以相同的方式工作。在我的系统上,我有一个位于以下位置的文本文件:

C:\Program Files\CodeGear\Delphi for PHP\2.0\privacy.txt

我可以通过将其放入Windows文件资源管理器的导航栏中来访问此文件:

file:///%ProgramFiles%/CodeGear/Delphi for PHP/2.0/privacy.txt

注意反斜杠被转换为正斜杠,无需转义空格。已经进行过测试并且可以正常工作。相应的res协议尚未测试,但是应该以同样的方式工作,当然,res协议略有不同,因为它还包括资源索引号。

有关语法,请参阅http://msdn.microsoft.com/en-us/library/ie/aa767740(v=vs.85).aspx


同时,空格需要编码为%20才能正常工作。我认为斜杠不起作用。 - Vladimir S.
是的,现在它可以工作了,这很好。非常感谢!在res:标签后面指定一些内容是否可能,以便从环境变量中读取例如文件夹%ALLUSERSPROFILE%。我需要这个,因为引用的文件始终在环境变量下的文件夹中,并且在系统之间会发生更改。XML或JavaScript或Visual Basic Script中有可能性吗?我试图找到,但没有成功。 - Vladimir S.
@Byron-LimTimothySteffan:你的评论是错误的。一般情况下,空格不需要转义。它们只需要在http(称为URL编码)中进行转义。对于本地XSLT来说,情况并非如此。此外,正斜杠确实有效。如果它们无效将是荒谬的。正斜杠是协议词汇表的基本组成部分。 - Sean B. Durkin
好的,在进一步研究后,我认为可以在res协议内完成。现在相应地调整答案。 - Sean B. Durkin
因此,情境如下: 我有一个测试报告,程序将其输出为XML格式。这个XML通过普通的XSL(即普通的香草味)转换成HTML。因此,XML引用了一个XSL,该XSL进一步引用其他XSL样式表等。到目前为止,我们将依赖项保存在系统文件夹res://中,但由于Win7管理员权限已更改,我们不能再在那里执行此操作。此外,测试报告应在每个系统上查看,由于我们不能再使用系统文件夹,例如%ALLUSERSPROFILE%,因此将依赖项放置在其中可能是一个选项。 但似乎没有办法将其放入XML中。 - Vladimir S.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接