我尝试与
建立联系<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="concat('file:///', substring-before('%RolesPath%', 'roles'),'Flores.chm')"/>
</xsl:attribute>
Help
</xsl:element>
但我收到错误:
文件文件:///Flores.chm未找到
我很确定,变量%RolesPath%工作正常。我通常在代码中使用它。如果我只在代码中使用
<xsl:value-of select="concat('file:///', substring-before('%RolesPath%', 'roles'),'Flores.chm')"/>
我得到了
文件:/// C:\布鲁姆\ Flores.chm
这是正确的道路。我在哪里做错了?
修改。 %RolesPath%存储指定程序文件夹的路径,该路径使用此代码。在我的情况下,%RolesPath%存储“C:\ Flores \ roles \”。
指定我的问题。我需要在程序的根文件夹中打开文件(Flores.chm)。程序可以安装在PC的任何地方,只有这样,我可以通过%RolesPath%获取路径。
答案 0 :(得分:1)
您传递给substring-before()
的内容只是一个字符串('%RolesPath%'
)。您似乎正在尝试使用Windows环境变量。这不会像你使用它一样工作。
我认为你有两个选择:
选项1
调用样式表时,将环境变量的值传递为xsl:param
。这适用于XSLT 1.0或2.0。
您需要xsl:param
:
<xsl:param name="RolesPath"/>
这就是你引用它的方式:
<a href="{concat('file:///', substring-before($RolesPath, 'roles'),'Flores.chm')}"/>
选项2
使用environment-variable()
功能。 这只适用于XSLT 3.0处理器,例如Saxon-PE或EE。
示例:
<a href="{concat('file:///', substring-before(environment-variable('RolesPath'), 'roles'),'Flores.chm')}"/>
这是environment-variable()
显示实际工作的另一个例子:
XSLT 3.0
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<environment-variable name="TEMP" value="{environment-variable('TEMP')}"/>
</xsl:template>
</xsl:stylesheet>
输出(当应用于任何格式良好的XML时)
<environment-variable name="TEMP" value="C:\Users\dhaley\AppData\Local\Temp"/>
答案 1 :(得分:1)
使用此较短的表达:
<a href="file:///{substring-before($RolesPath, 'roles')}Flores.chm"/>
其中$RolesPath
作为外部全局参数传递给转换。
如何将外部参数传递给转换,从一个XSLT处理器到另一个XSLT处理器 - 阅读您的XSLT处理器文档。某些XSLT处理器还允许将字符串类型的参数从命令行执行实用程序传递给转换。