2015-10-29 2 views
4

Я собираю файлы своего проекта, используя Heat. но так как я хочу иметь ярлыки в целевой системе, основной исполняемый файл должен быть проигнорирован Heat и добавлен вручную в файле wxs. Я использую следующий файл XSL сказать тепло игнорировать мой исполняемый файл (Aparati.exe)Использование переменных Wix в XSL Transfomration

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"> 
    <!-- strip out the exe files from the fragment heat generates. --> 
    <xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, 'Aparati.exe')]" use="@Id" /> 
    <xsl:template match="wix:Component[key('exe-search', @Id)]" /> 
    <xsl:template match="wix:ComponentRef[key('exe-search', @Id)]" /> 
</xsl:stylesheet> 

Проблема заключается в том, что я не хочу, чтобы написать имя файла прямо здесь, а я хочу, чтобы установить исполняемое имя файла как аргумент (возможно, переменная wix) в моем файле msbuild. Я был бы очень благодарен, если бы кто-нибудь мог сказать мне, как это возможно. И какие другие подходы я могу принять для решения этой проблемы.

ответ

2

После некоторого исследования я придумал это решение, которое загружает имя приложения из моего файла msbuild.

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:msbuild="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- strip out the exe files from the fragment heat generates. --> 

    <xsl:output method="xml" indent="yes" /> 
    <!-- take the app name from msbuild file --> 
    <xsl:param name="appName" select="document('..\build.proj')//msbuild:AppName/text()"/> 
    <xsl:param name="exeName" select="concat($appName, '.exe')" /> 

    <!-- copy all the elements --> 
    <xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 
    <!-- except for Component and ComponentRef elements which contain the $exeName --> 
    <xsl:template match="wix:Component|wix:ComponentRef"> 
    <xsl:choose> 
     <xsl:when test="contains(wix:File/@Source, $exeName)"></xsl:when> 
     <xsl:otherwise> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Я также посмотрел на источнике тепла код, чтобы увидеть, если он поддерживает XSLT вход пар, но это, кажется, не поддерживает эту функцию еще.

PS: Там, на жаре, я увидел какое-то настоящее уродливое кодирование. Надеюсь, они рассмотрят рефакторинг источника.