如何使用 XSLT 从另一个 wxs 文件中过滤重复项
How to use XSLT to filter duplicates from another wxs file
我有什么
我在使用 xslt 查找重复组件时遇到问题。
我正在使用热量来收获 2 个项目。这些项目共享一些引用(.dll 文件)。现在热量会产生 2 个碎片
- ConfiguratorFiles.wxs
- ServiceFiles.wxs
首先创建 ConfiguratorFiles.wxs 并使用完全基本的过滤器:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
<xsl:template match="wix:Component[key('service-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('service-search', @Id)]" />
输出完全没问题,因为我真的希望复制每个 dll 并过滤掉 pdb 文件。
创建 ServiceFiles.wxs 文件时出现问题。我只是不知道如何检查第一个 wxs 文件中是否存在元素。
That link 提供了信息,我可以嵌入一个 C# 函数来执行一些逻辑。这对我来说似乎是个巧妙的技巧,但我仍然不知道如何搜索其他文件的内容。
当前 ServiceFilter.xslt
ServiceFilter.xslt 与 ConfiguratorFiles.xslt 几乎相同,但我也过滤掉了 .exe 文件,因为我手动处理它们
<!--Match and ignore .pdb files-->
<xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
<xsl:template match="wix:Component[key('service-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('service-search', @Id)]"/>
<!--Match and ignore .exe files-->
<xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, '.exe')]" use="@Id"/>
<xsl:template match="wix:Component[key('exe-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('exe-search', @Id)]"/>
示例:
我在两个(ConfiguratorFiles.wxs 和 ServiceFiles.wxs)中都有以下组件。这会导致错误,这就是我需要过滤重复项的原因。
<Component Id="Foo.Base.dll" Guid="*">
<File Id="Foo.Base.dll" KeyPath="yes" Source="$(var.Foo.DSI.Configurator.TargetDir)\Foo.Base.dll" />
</Component>
实际问题
如何编写过滤重复项的过滤器 "ServiceFilter.xslt",以便 ServiceFiles.wxs 不包含包含在 ConfiguratorFiles.wxs 中的文件?
更新
我现在正在尝试的是使用 C# 方法。
现在我只需要弄清楚,如何让第一个文件中的所有组件填写 FindDuplicate 方法,因为它目前过滤所有内容:)
<!--Match and ignore duplicate components-->
<xsl:key name="duplicate-search" match="wix:Component[user:FindDuplicate(wix:File/@Source)]" use="@Id"/>
<xsl:template match="wix:Component[key('duplicate-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('duplicate-search', @Id)]"/>
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public bool FindDuplicate(string name){
return true;
}
]]>
</msxsl:script>
解决方案非常简单。
我现在创建 2 个单独的 MSI 文件。一个安装配置器,一个安装服务。
这2个MSI文件是在2个不同的WiX项目中创建的,所以重复条目的问题不会再出现了。
我有什么
我在使用 xslt 查找重复组件时遇到问题。 我正在使用热量来收获 2 个项目。这些项目共享一些引用(.dll 文件)。现在热量会产生 2 个碎片
- ConfiguratorFiles.wxs
- ServiceFiles.wxs
首先创建 ConfiguratorFiles.wxs 并使用完全基本的过滤器:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
<xsl:template match="wix:Component[key('service-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('service-search', @Id)]" />
输出完全没问题,因为我真的希望复制每个 dll 并过滤掉 pdb 文件。
创建 ServiceFiles.wxs 文件时出现问题。我只是不知道如何检查第一个 wxs 文件中是否存在元素。
That link 提供了信息,我可以嵌入一个 C# 函数来执行一些逻辑。这对我来说似乎是个巧妙的技巧,但我仍然不知道如何搜索其他文件的内容。
当前 ServiceFilter.xslt
ServiceFilter.xslt 与 ConfiguratorFiles.xslt 几乎相同,但我也过滤掉了 .exe 文件,因为我手动处理它们
<!--Match and ignore .pdb files-->
<xsl:key name="service-search" match="wix:Component[contains(wix:File/@Source, '.pdb')]" use="@Id" />
<xsl:template match="wix:Component[key('service-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('service-search', @Id)]"/>
<!--Match and ignore .exe files-->
<xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, '.exe')]" use="@Id"/>
<xsl:template match="wix:Component[key('exe-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('exe-search', @Id)]"/>
示例:
我在两个(ConfiguratorFiles.wxs 和 ServiceFiles.wxs)中都有以下组件。这会导致错误,这就是我需要过滤重复项的原因。
<Component Id="Foo.Base.dll" Guid="*">
<File Id="Foo.Base.dll" KeyPath="yes" Source="$(var.Foo.DSI.Configurator.TargetDir)\Foo.Base.dll" />
</Component>
实际问题
如何编写过滤重复项的过滤器 "ServiceFilter.xslt",以便 ServiceFiles.wxs 不包含包含在 ConfiguratorFiles.wxs 中的文件?
更新
我现在正在尝试的是使用 C# 方法。 现在我只需要弄清楚,如何让第一个文件中的所有组件填写 FindDuplicate 方法,因为它目前过滤所有内容:)
<!--Match and ignore duplicate components-->
<xsl:key name="duplicate-search" match="wix:Component[user:FindDuplicate(wix:File/@Source)]" use="@Id"/>
<xsl:template match="wix:Component[key('duplicate-search', @Id)]"/>
<xsl:template match="wix:ComponentRef[key('duplicate-search', @Id)]"/>
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public bool FindDuplicate(string name){
return true;
}
]]>
</msxsl:script>
解决方案非常简单。
我现在创建 2 个单独的 MSI 文件。一个安装配置器,一个安装服务。 这2个MSI文件是在2个不同的WiX项目中创建的,所以重复条目的问题不会再出现了。