如何使用XSLT从另一个wxs文件

时间:2018-05-17 10:15:02

标签: xslt wix windows-installer heat

我拥有什么

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

  1. ConfiguratorFiles.wxs
  2. ServiceFiles.wxs
  3. WiX Project Structure

    首先创建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链接提供了我可以嵌入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>
    

    实际问题

    如何编写过滤器&#34; ServiceFilter.xslt&#34;过滤重复项,以便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>
    

1 个答案:

答案 0 :(得分:1)

解决方案非常简单。

我现在创建2个独立的MSI文件。一个安装配置器,一个安装服务。 这2个MSI文件是在2个不同的WiX项目中创建的,因此重复条目的问题不再出现。