1

我正在尝试使用 WiX 3.7 来生成 MSI 安装程序。我正在使用 heat.exe 从我的构建目录的内容中创建一个 wxs 片段,然后我在一个单独的静态 wxs 文件中引用它。我还需要对这个文件应用 XSL 转换,以便将“ServiceInstall”节点添加到组件之一。即使对于像我这样的 XSL 菜鸟,添加节点也相当简单。但是,为了使生成的 XML 格式正确,我需要向 Wix 节点和 Fragment 节点添加对 WixUtil 扩展的引用。所以,我的 XML 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <DirectoryRef Id="Main">
        <Component Id="xyz" Guid="{123}">
            <File Id="xyz" KeyPath="yes" Source="$(var.mainDir)\some.exe" />
            <util:ServiceInstall Id="xyz" Type="ownProcess" Vital="yes" Name="someService" DisplayName="someService" Description="An example service." etc="etc" />
        </Component>
    </DirectoryRef>
   </Fragment>
 </Wix>

我需要它是这样的:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <DirectoryRef Id="Main">
        <Component Id="xyz" Guid="{123}">
            <File Id="xyz" KeyPath="yes" Source="$(var.mainDir)\some.exe" />
            <util:ServiceInstall Id="xyz" Type="ownProcess" Vital="yes" Name="someService" DisplayName="someService" Description="An example service." etc="etc" />
        </Component>
    </DirectoryRef>
   </Fragment>
 </Wix>

我正在将命名空间声明动态添加到 Wix 元素,并且使用以下代码(从 StackOverflow 上的另一个答案借用)可以正常工作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:old="http://schemas.microsoft.com/wix/2006/wi"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
exclude-result-prefixes="old">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="pNewNamespace" select="'http://schemas.microsoft.com/wix/2006/wi'"/>
<xsl:variable name="vXsi" select="document('')/*/namespace::*[name()='util']"/>

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

但是,当我尝试使用相同的方法将声明添加到 Fragment 节点时,它会返回乱码 xml。感觉这应该是一项非常简单、直接的任务。我究竟做错了什么?

4

1 回答 1

2

更新: util 命名空间不用于 ServiceInstall。我已经更改了 XSL,但留下了解释。

XML 命名空间前缀只需要在它使用的元素中或祖先中定义。XSL 处理器应将其输出到合适的位置。

你做的改造是两个步骤吗?这不应该是必要的,可能是给你带来麻烦的原因。

对于这个 heat 命令,这个 XSL 将完成您讨论过的全部修改;不过,您可能需要根据您的情况调整热参数。

heat dir bin -out heated.wxs -t ServiceInstall.xsl -var var.mainDir

服务安装.xsl:

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

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

    <xsl:template match="wix:Component[wix:File/@Source='$(var.mainDir)\some.exe']">
     <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <wix:ServiceInstall 
            Id="xyz" 
            Type="ownProcess" 
            Vital="yes" 
            Name="someService" 
            DisplayName="someService" 
            Description="An example service." 
            etc="etc" />
     </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>
于 2013-06-03T19:28:22.637 回答