我讨厌几乎复制现有的问题,但所提供的答案尚未奏效:
这是我的.wxs的样子:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="SDKCONTENTDIR">
<Directory Id="dirE2EC21E8B765C611E918FB22F30721D1" Name=".svn" />
<Directory Id="dir7DC42F44E7FE9E20277B180A353D0263" Name="bin" />
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="sdkContent">
<Component Id="cmp5E86312F0CA2C53B8173AECD6A428747" Directory="dirE2EC21E8B765C611E918FB22F30721D1" Guid="{E87F312D-9DA2-4A68-B6C5-BCE2FF90720C}">
<File Id="filB766A28A7577EB4311FD03CD707BC211" KeyPath="yes" Source="$(var.publishContentDir)\.svn\all-wcprops" />
</Component>
<Component Id="cmp6EF52B3E331F226299060D45F533DC07" Directory="dirE2EC21E8B765C611E918FB22F30721D1" Guid="{5EA6AB2D-20C3-4B07-8E0A-7C28135BE922}">
<File Id="fil83205196F05211A66F9D25A7A5496FBA" KeyPath="yes" Source="$(var.publishContentDir)\.svn\entries" />
</Component>
...
我使用此.xsl代码排除:
<xsl:key name="svn-search" match="wix:Component[ancestor::wix:Directory/@Name = '.svn']" use="@Id" />
<xsl:template match="wix:Directory[@Name='.svn']" />
<xsl:template match="wix:Component[key('svn-search', @Id)]" />
但是我得到了很多&#34;错误48未解决的对符号的引用&#34;错误,因为它没有删除所有子元素。
想法?
答案 0 :(得分:22)
我有同样的问题,并找到了答案。但是,我不满意需要按名称指定.svn文件夹的子目录。如果.svn目录将来更改结构,或者我有一个名为tmp的目录,这可能会中断......
当我对你的xml运行你的xsl时,我还注意到有一些目录碎片散落在周围。作为强迫症并想要清理它,我注意到heat.exe有一个“压制片段”的选项。实际效果是使目录标签实际上彼此嵌套,这使得编写xsl文件变得更加容易。
从嵌套标记结构中删除.svn目录后,我仍然遇到一个问题,即ComponentRefs指向已删除的组件ID及其包含的目录。作为一个xsl noob,我不得不做一点挖掘,但发现我可以在xsl:key的use属性中使用“descendant ::”。
简而言之,这是我的解决方案。注意,我还没有尝试用它来构建MSI;这将在一两天内到来。但即使它不完美,至少这可能会帮助其他有同样问题的人......
使用: heat.exe dir source -t excludesvn.xsl -sfrag -o files.wxs
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
<!-- Copy all attributes and elements to the output. -->
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="*" />
</xsl:copy>
</xsl:template>
<xsl:output method="xml" indent="yes" />
<!-- Search directories for the components that will be removed. -->
<xsl:key name="svn-search" match="wix:Directory[@Name = '.svn']" use="descendant::wix:Component/@Id" />
<!-- Remove directories. -->
<xsl:template match="wix:Directory[@Name='.svn']" />
<!-- Remove componentsrefs referencing components in those directories. -->
<xsl:template match="wix:ComponentRef[key('svn-search', @Id)]" />
</xsl:stylesheet>
答案 1 :(得分:4)
以下是我的工作:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
<!-- Copy all attributes and elements to the output. -->
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="*" />
</xsl:copy>
</xsl:template>
<xsl:output method="xml" indent="yes" />
<!-- Create searches for the directories to remove. -->
<xsl:key name="svn-search" match="wix:Directory[@Name = '.svn']" use="@Id" />
<xsl:key name="tmp-search" match="wix:Directory[@Name = 'tmp']" use="@Id" />
<xsl:key name="prop-base-search" match="wix:Directory[@Name = 'prop-base']" use="@Id" />
<xsl:key name="text-base-search" match="wix:Directory[@Name = 'text-base']" use="@Id" />
<xsl:key name="props-search" match="wix:Directory[@Name = 'props']" use="@Id" />
<!-- Remove directories. -->
<xsl:template match="wix:Directory[@Name='.svn']" />
<xsl:template match="wix:Directory[@Name='props']" />
<xsl:template match="wix:Directory[@Name='tmp']" />
<xsl:template match="wix:Directory[@Name='prop-base']" />
<xsl:template match="wix:Directory[@Name='text-base']" />
<!-- Remove Components referencing those directories. -->
<xsl:template match="wix:Component[key('svn-search', @Directory)]" />
<xsl:template match="wix:Component[key('props-search', @Directory)]" />
<xsl:template match="wix:Component[key('tmp-search', @Directory)]" />
<xsl:template match="wix:Component[key('prop-base-search', @Directory)]" />
<xsl:template match="wix:Component[key('text-base-search', @Directory)]" />
<!-- Remove DirectoryRefs (and their parent Fragments) referencing those directories. -->
<xsl:template match="wix:Fragment[wix:DirectoryRef[key('svn-search', @Id)]]" />
<xsl:template match="wix:Fragment[wix:DirectoryRef[key('props-search', @Id)]]" />
<xsl:template match="wix:Fragment[wix:DirectoryRef[key('tmp-search', @Id)]]" />
<xsl:template match="wix:Fragment[wix:DirectoryRef[key('prop-base-search', @Id)]]" />
<xsl:template match="wix:Fragment[wix:DirectoryRef[key('text-base-search', @Id)]]" />
</xsl:stylesheet>
答案 2 :(得分:0)
您得到“未解析的符号”错误,因为您过滤掉了Component元素,但保留了ComponentRef元素。因此,这些元素保持孤立并引用缺少的组件元素。这被WiX编译器捕获。
正如您现在可能猜到的那样,也过滤掉相应的ComponentRef元素。希望这会有所帮助。