如何使用 XSLT 从另一个 wxs 文件中过滤重复项

How to use XSLT to filter duplicates from another wxs file

我有什么

我在使用 xslt 查找重复组件时遇到问题。 我正在使用热量来收获 2 个项目。这些项目共享一些引用(.dll 文件)。现在热量会产生 2 个碎片

  1. ConfiguratorFiles.wxs
  2. 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项目中创建的,所以重复条目的问题不会再出现了。