Transform Heat generated .wxs with XSLT (add RegistryValue and edit some values)

元气小坏坏 提交于 2019-12-04 07:19:27

You say:

As soon as i activate

<xsl:template match="wix:Component/wix:File">
   <xsl:copy-of select="." />
   <RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</xsl:template>

The File changes that are in XSL are not applied like add a prefix, change keypath to no, if i remove the one that adds the registry the file changes work like a charm!

By "activate", I assume that you mean add it to the XSLT file. When it is added to the rest of the transforms, you create an ambiguous rule match situation that should elicit a warning such as what Saxon would say:

 [xslt] : Error! Ambiguous rule match for /Wix/Fragment[1]/DirectoryRef[1]/Directory[1]/Component[1]/File[1]
 [xslt] Matches both "wix:Component/wix:File" on line 28 of file:/c:/gd/usr/kjh/proj/try/xslt/try.xsl
 [xslt] and "wix:File[@Id]" on line 19 of file:/c:/gd/usr/kjh/proj/try/xslt/try.xsl

Here's a resolution of the ambiguity:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
                xmlns="http://schemas.microsoft.com/wix/2006/wi"
                exclude-result-prefixes="xsl wix">

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wix:Component/wix:File[@Id]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="KeyPath">
        <xsl:text>no</xsl:text>
      </xsl:attribute>
    </xsl:copy>
    <RegistryValue Root="HKCU" Key="Software\Product" Name="installed" Type="integer" Value="1" KeyPath="yes" />
  </xsl:template>

  <xsl:template match="wix:Component/wix:File[not(@Id)]">
    <!-- Placeholder for handling anything that should happen
         different for wix:File without @Id attribute.  -->
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
    </xsl:copy>
  </xsl:template>

  <!--Give Compoentent ID prefix C_-->
  <xsl:template match="wix:Component/@Id">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="concat('C_', .)" />
    </xsl:attribute>
  </xsl:template>

  <!--Give Componentref ID prefix C_-->
  <xsl:template match="wix:ComponentRef/@Id">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="concat('C_', .)" />
    </xsl:attribute>
  </xsl:template>

  <!--Give Directory ID prefix Dir_-->
  <xsl:template match="wix:Directory/@Id">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="concat('Dir_', .)" />
    </xsl:attribute>
  </xsl:template>

  <!--Give File ID prefix File_-->
  <xsl:template match="wix:File/@Id">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="concat('File_', .)" />
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

Which, when run on your input file, produces the desired output:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
   <Fragment>
      <DirectoryRef Id="Dir_Exentsions">
         <Directory Id="Dir_SOMEFILE" Name="SOMEFILE">
            <Component Id="C_SOMEFILE" Guid="7D8FDF2D-CED9-4A08-A57E-96CD7FFA8E9A">
               <File Id="File_SOMEFILE" KeyPath="no" Source="$(var.Source)\SOMEFILE"/>
               <RegistryValue Root="HKCU"
                              Key="Software\Product"
                              Name="installed"
                              Type="integer"
                              Value="1"
                              KeyPath="yes"/>
            </Component>
         </Directory>
      </DirectoryRef>
   </Fragment>
</Wix>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!