2013-06-03 58 views
0

我正在嘗試使用WiX 3.7生成MSI安裝程序。我使用heat.exe從我的build目錄的內容創建一個wxs片段,然後我在一個單獨的靜態wxs文件中引用它。我還需要對此文件應用XSL轉換,以便將「ServiceInstall」節點添加到其中一個組件。即使是像我這樣的XSL noob,添加節點也相當簡單。但是,爲了使生成的XML格式良好,我需要將對WixUtil擴展的引用添加到Wix節點和Fragment節點。所以,我的XML是這樣的:使用XSL向節點添加命名空間

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

我動態添加空間聲明的維克斯元素和工作正常,使用下面的代碼,從另一個答案借來的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> 

然而,當我嘗試用同樣的方法在聲明添加到片段節點,它返回亂碼XML。感覺這應該是一個非常簡單,直接的任務。我究竟做錯了什麼?

+0

你確定你需要的聲明'的xmlns:UTIL = 「http://schemas.microsoft.com/wix/UtilExtension」'兩次?它在根元素上的存在就足夠了。 –

+0

我認爲它會 - 但節點似乎不會繼承它。當試圖構建我的WixProj並將聲明添加到根元素但不是時,我得到以下內容:「組件元素包含意外的子元素」以及隨附的「無法找到屬性'xyz'的模式信息」消息。 ETA - 感謝您的回覆。 –

回答

1

更新: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>