6

私は heat を使用してファイルを収集していますが、通常の "filXXXXXXXX" ではなく適切な ID を付けたいと思っています。これは主に、インストーラーの他の部分で参照する必要があるためです。Id は、異なるマシン上や異なるファイル コンテンツに対して常に同じであることを知っているので、たとえば、CI サーバー上で構築するときに変更されないという確信を持って使用できます。

もちろん、この値をもう少し人間に優しいものにした方がずっと良いでしょう。Heat には、ファイル ID を生成するためのコマンドライン オプションがないようです (編集: 明らかに、数値 ID の生成を停止し、ファイル名を ID として使用する -suid オプションがありますが、多くのシナリオでは実行できません)。 、だから私は 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 を変更せずにすぐにコピーされます。

何か案が?

4

1 に答える 1

6

基本的な問題は、名前空間または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>
于 2012-07-20T11:24:41.910 に答える