加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 使用XSLT转换Heat生成的.wxs(添加RegistryValue并编辑一

发布时间:2020-12-16 23:16:20 所属栏目:百科 来源:网络整理
导读:这是我想要的输出: Component Id="C_SOMEFILE" Guid="some-guid-here" File Id="File_SOMEFILE" Source="$(var.Source)SOMEFILE" KeyPath="no" / RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="y
这是我想要的输出:

<Component Id="C_SOMEFILE" Guid="some-guid-here">
    <File Id="File_SOMEFILE" Source="$(var.Source)SOMEFILE" KeyPath="no" />
    <RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

这是我的XSLT文件:

<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>

<!--Set KeyPath to NO-->
<xsl:template match='wix:File[@Id]'>
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="KeyPath">
            <xsl:text>no</xsl:text>
        </xsl:attribute>
    </xsl:copy>
</xsl:template>

<xsl:template match="wix:Component/wix:File">
    <xsl:copy-of select="." />
    <RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</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的输出:

<Component Id="C_SOMEFILE" Guid="some-guid-here">
    <File Id="SOMEFILE" KeyPath="yes" Source="$(var.Source)SOMEFILE" />
    <RegistryValue Root="HKCU" Key="SoftwareProduct" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>

一旦我激活

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

XSL中的文件更改未应用,如添加前缀,将keypath更改为no,如果我删除添加注册表的文件更改工作就像魅力!

我做错了什么?

感谢任何帮助,谢谢.

更新:这是没有转换的XML的原始示例:

<?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
       <Fragment>
          <DirectoryRef Id="Dir_Exentsions">
              <Directory Id="SOMEFILE" Name="SOMEFILE">
                 <Component Id="SOMEFILE" Guid="7D8FDF2D-CED9-4A08-A57E-96CD7FFA8E9A">
                    <File Id="SOMEFILE" KeyPath="yes" Source="$(var.Source)SOMEFILE" />
                 </Component>          
              </Directory>
          </DirectoryRef>
       </Fragment>
     </Wix>

解决方法

你说:

As soon as i activate

<xsl:template match="wix:Component/wix:File">
   <xsl:copy-of select="." />
   <RegistryValue Root="HKCU" Key="SoftwareProduct" 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!

通过“激活”,我认为你的意思是将它添加到XSLT文件中.当它被添加到其余的变换时,你会创建一个模糊的规则匹配情况,它应该引出一个警告,比如撒克逊会说的话:

[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

这是歧义的解决方案:

<?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="SoftwareProduct" 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>

在输入文件上运行时,会产生所需的输出:

<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="SoftwareProduct"
                              Name="installed"
                              Type="integer"
                              Value="1"
                              KeyPath="yes"/>
            </Component>
         </Directory>
      </DirectoryRef>
   </Fragment>
</Wix>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读