我可以使用转换排除 Wix Heat 的特定文件名吗?
Can I exclude a specific file name with Wix Heat using transforms?
Wix 是否可以使用转换排除特定文件名?
我可以排除 包含 特定字符串的文件,但这排除了与该字符串匹配的任何文件名。例如,我可以用以下内容排除 file.exe;
<xsl:key name="fileexe-search" match="wix:Component[contains(wix:File/@Source, 'file.exe')]" use="@Id"/>
但这也会排除名称中带有 file.exe 的文件,例如 file.exe.config。
谢谢。
看起来你应该使用 ends-with
而不是 contains
。但是 ends-with
在 XSLT 1.0 中不存在。 :)
This answer 提供了足够的细节来了解如何实现它。基本上它是 substring
和 string-length
函数的组合。
此外,您还应该考虑在比较前将外壳归一化。也就是说,最好将两个字符串都小写(或大写)——原始字符串和它结尾的字符串。 This post 可以告诉你如何去做。
牢记所有这些,您最终会得到类似这样的结果:
<!-- The starting backslash is there to filter out files like 'abcfile.exe' -->
<!-- Besides, it's lower-cased to ease comparison -->
<xsl:variable name="FileName">\file.exe</xsl:variable>
<xsl:variable name="ABC">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="abc">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:key name="fileexe-search" match="wix:Component[translate(substring(wix:File/@Source, string-length(wix:File/@Source) - string-length($FileName) + 1), $ABC, $abc) = $FileName]" use="@Id"/>
虽然@Yan 提供的答案有效,但我更喜欢使用 C#,它更易于使用。
<xsl:stylesheet version="1.0"
...
xmlns:my="urn:my-installer">
...
<msxsl:script language="C#" implements-prefix="my">
<msxsl:using namespace="System.IO" />
<![CDATA[
public bool EndsWith(string str, string end)
{
if (string.IsNullOrEmpty(str))
return false;
if (string.IsNullOrEmpty(end))
return false;
return str.EndsWith(end);
}
]]>
</msxsl:script>
...
用法示例:
<xsl:key name="ignored-components-search" match="wix:Component[my:EndsWith(wix:File/@Source, '.pssym')
or my:EndsWith(wix:File/@Source, '.pdb')
or my:EndsWith(wix:File/@Source, '.cs')
or my:EndsWith(wix:File/@Source,'.xml')
]" use="@Id" />
Wix 是否可以使用转换排除特定文件名? 我可以排除 包含 特定字符串的文件,但这排除了与该字符串匹配的任何文件名。例如,我可以用以下内容排除 file.exe;
<xsl:key name="fileexe-search" match="wix:Component[contains(wix:File/@Source, 'file.exe')]" use="@Id"/>
但这也会排除名称中带有 file.exe 的文件,例如 file.exe.config。
谢谢。
看起来你应该使用 ends-with
而不是 contains
。但是 ends-with
在 XSLT 1.0 中不存在。 :)
This answer 提供了足够的细节来了解如何实现它。基本上它是 substring
和 string-length
函数的组合。
此外,您还应该考虑在比较前将外壳归一化。也就是说,最好将两个字符串都小写(或大写)——原始字符串和它结尾的字符串。 This post 可以告诉你如何去做。
牢记所有这些,您最终会得到类似这样的结果:
<!-- The starting backslash is there to filter out files like 'abcfile.exe' -->
<!-- Besides, it's lower-cased to ease comparison -->
<xsl:variable name="FileName">\file.exe</xsl:variable>
<xsl:variable name="ABC">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="abc">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:key name="fileexe-search" match="wix:Component[translate(substring(wix:File/@Source, string-length(wix:File/@Source) - string-length($FileName) + 1), $ABC, $abc) = $FileName]" use="@Id"/>
虽然@Yan 提供的答案有效,但我更喜欢使用 C#,它更易于使用。
<xsl:stylesheet version="1.0"
...
xmlns:my="urn:my-installer">
...
<msxsl:script language="C#" implements-prefix="my">
<msxsl:using namespace="System.IO" />
<![CDATA[
public bool EndsWith(string str, string end)
{
if (string.IsNullOrEmpty(str))
return false;
if (string.IsNullOrEmpty(end))
return false;
return str.EndsWith(end);
}
]]>
</msxsl:script>
...
用法示例:
<xsl:key name="ignored-components-search" match="wix:Component[my:EndsWith(wix:File/@Source, '.pssym')
or my:EndsWith(wix:File/@Source, '.pdb')
or my:EndsWith(wix:File/@Source, '.cs')
or my:EndsWith(wix:File/@Source,'.xml')
]" use="@Id" />