2012-07-20 51 views
4

我正在收集一個帶有熱量的文件,我真的很想給它一個體面的ID,而不是通常的「filXXXXXXXX」,主要是因爲我需要在其他部分參考它安裝程序。我知道Id始終是相同的,在不同的機器上以及不同的文件內容顯然是如此,所以我可以堅信它在CI服務器上建立時不會改變。在Wix中指定一個帶有熱度的文件ID

當然,讓這個值更友好一些會更好。看起來Heat沒有命令行選項來生成文件ID(EDIT:顯然有一個-suid選項會停止生成數字ID,並且只使用文件名作爲ID,無論如何這在許多場景中都不可行) ,所以我正在經歷編寫XSLT的痛苦,但無法實現我想要的,任何人都可以幫忙?

這是片段文件:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="DBScripts" /> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="CSInstallerConfig"> 
      <Component Id="cmpD6BAFC85C2660BE8744033953284AB03" Directory="DBScripts" Guid="{A39BABF5-2BAC-46EE-AE01-3B47D6C1C321}"> 
       <File Id="filB31AC19B3A3E65393FF9059147CDAF60" KeyPath="yes" Source="$(var.CONFIG_PATH)\CSInstaller.config" /> 
      </Component> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

這是XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|*" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="File"> 
     <xsl:attribute name="Id"> 
      <xsl:value-of select="123"/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

現在,我和XSL一個真正的菜鳥,所以也許上面的文件是總廢話,但無論如何,發生的事情是「文件」元素被直接複製,而不會改變Id。

任何想法?

回答

5

您的基本問題是命名空間或您的XML根元素wi。 你沒有解決這個問題,所以XSLT實際上根本找不到你的File元素。

接下來,你就必須做對模板的小調整到了文件的其他屬性正確複製:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:wi="http://schemas.microsoft.com/wix/2006/wi"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|*" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="wi:File"> 
     <xsl:copy> 
      <xsl:attribute name="Id"> 
       <xsl:value-of select="123"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="@*[not(name()='Id')]" /> 
      <xsl:apply-templates select="*" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

非常感謝!這正是它是:) – Tallmaris 2012-07-20 13:22:58

相關問題