我可以使用变换使用Wix Heat排除特定文件名吗?

时间:2015-09-15 16:05:33

标签: wix installer heat

是否可以使用转换使用Wix排除特定文件名? 我可以排除包含某个字符串的文件,但这会排除与该字符串匹配的任何文件名。例如,我可以使用以下内容排除file.exe;

<xsl:key name="fileexe-search" match="wix:Component[contains(wix:File/@Source, 'file.exe')]" use="@Id"/>

但这也会排除名称中包含file.exe的文件,例如file.exe.config。

感谢。

2 个答案:

答案 0 :(得分:1)

您似乎应该使用ends-with代替contains。但是在XSLT 1.0中不存在ends-with。 :)

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"/>

答案 1 :(得分:0)

虽然@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" />