我可以使用转换排除 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 提供了足够的细节来了解如何实现它。基本上它是 substringstring-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" />