是否可以使用转换使用Wix排除特定文件名? 我可以排除包含某个字符串的文件,但这会排除与该字符串匹配的任何文件名。例如,我可以使用以下内容排除file.exe;
<xsl:key name="fileexe-search" match="wix:Component[contains(wix:File/@Source, 'file.exe')]" use="@Id"/>
但这也会排除名称中包含file.exe的文件,例如file.exe.config。
感谢。
答案 0 :(得分:1)
您似乎应该使用ends-with
代替contains
。但是在XSLT 1.0中不存在ends-with
。 :)
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"/>
答案 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" />