我正在尝试使用WiX 3.7生成MSI安装程序。我正在使用heat.exe从我的构建目录的内容创建一个wxs片段,然后我在一个单独的静态wxs文件中引用它。我还需要对此文件应用XSL转换,以便将“ServiceInstall”节点添加到其中一个组件。即使对于像我这样的XSL noob,添加节点也相当简单。但是,为了使结果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。感觉这应该是一个非常简单,直截了当的任务。我做错了什么?
答案 0 :(得分:2)
更新:util命名空间不用于ServiceInstall。我已经改变了XSL,但留下了解释。
XML名称空间前缀只需要在祖先中或祖先中使用的元素中定义。 XSL处理器应该在合适的位置输出它。
你在做转型是两步吗?这不应该是必要的,可能是导致你麻烦的原因。
对于这个加热命令,这个XSL将完成你所讨论的整个修改;但是,您可能希望根据自己的情况调整热量参数。
heat dir bin -out heated.wxs -t ServiceInstall.xsl -var var.mainDir
ServiceInstall.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>