[Wix] [Harvest]如何获取匹配组件的Guid并将其设置为Xsl中的属性

时间:2016-12-06 17:45:46

标签: xslt wix heat

Hy大家,  我正在使用Wix with Heat和XslTransform文件。  我想使用创建的UI对话框自定义我的App.config connectionString。因此,我使用如下的Xsl Transformation来添加XmlFile副本:

    <xsl:template match="wix:Component[wix:File[@Source='$(var.SourceDir)\App.config']]">
<xsl:copy>
  <xsl:apply-templates select="node() | @*" />
  <util:XmlFile Id="UpdateBaseAddress"
   Action="setValue"
   File="[I want to put here my auto generated ID for the App.config File Component]"
   SelectionLanguage="XPath"
   Permanent="yes"
   ElementPath="/configuration/connectionStrings/"
   Name="connectionString" Value="[DatabaseConnectionString]" >
   </util:XmlFile>
</xsl:copy>
</xsl:template>

我尝试了很多没有成功的方法。您是否有如何将匹配的文件ID设置为我的“文件”属性? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您无需在此处放置组件ID。 File属性需要物理文件的路径,而不是MSI组件ID。以下是如何实现类似功能的WiX片段(虽然不是XmlFile,而是XmlConfig元素):

<Component Id="ConnectionStringChanges" Guid="{GUID-GOES-HERE}" Directory="App_Config">
  <CreateFolder/>
  <Condition>NOT Installed</Condition>
  <util:XmlConfig Id="ConnectionStringChange" ElementPath="connectionStrings/add[\[]@name='core'[\]]"
                  File="[!ConnectionStrings.config]" Name="connectionString" Action="create" Node="value" On="install"
                  PreserveModifiedDate="yes" Value="user id=[SQL_SERVER_CONFIG_USER];password=[SQL_SERVER_CONFIG_PASSWORD];Data Source=[SQL_SERVER];Database=[DBPREFIX]Core_DB" />
  </Component>

这里需要注意的事情:

如果您将Directory组件嵌套在右<Component>元素下,则ConnectionStringChanges元素的<Directory>属性可以省略。但是,如果使用Heat自动生成目录结构,则可以使用此XSL代码段将App_Config文件夹的自动生成ID替换为自定义ID:

<xsl:template match="wix:DirectoryRef/wix:Directory[@Name='App_Config']">
  <xsl:element name="Directory" xmlns="http://schemas.microsoft.com/wix/2006/wi">
     <xsl:attribute name="Id">App_Config</xsl:attribute>
     <xsl:attribute name="Name">
        <xsl:value-of select="@Name"/>
     </xsl:attribute>
     <xsl:apply-templates />
  </xsl:element>

只要ConnectionStrings.config文件声明也是自动生成的,您应该应用类似的技巧来引用\[!ConnectionStrings.config\] syntax文件:

<xsl:template match="wix:DirectoryRef/wix:Directory[@Name='App_Config']/wix:Component[wix:File[@Source='$(var.Source)\App_Config\ConnectionStrings.config']]">
  <xsl:copy>
     <xsl:copy-of select="@*"/>
     <xsl:attribute name="NeverOverwrite">yes</xsl:attribute>
     <xsl:element name="File" xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <xsl:attribute name="Id">ConnectionStrings.config</xsl:attribute>
        <xsl:copy-of select="wix:File/@KeyPath | wix:File/@Source"/>
     </xsl:element>
  </xsl:copy>

希望这有帮助。