0

Wix ツールセットの Heat を使用してインストーラー用のコンポーネントを生成しますが、ユーザーごとのインストーラーはほとんどないため、Heat の Autogenerate Guids を使用できません。GUID をランダムに生成することはできますが、コンポーネント ルールのため、これは望ましくありません。

したがって、各ファイルの静的 GUID を追加した生成された構造とは異なる構造で、インストールに含める必要があるファイルのリストを含む XML があります。私がやりたいことはfilename、自分の XML と生成された XML を一致させ、生成された XML に GUID を挿入することです。

以下は、変換を行わない xml のサンプルです。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="Dir_Sample">
            <Directory Id="Folder1" Name="Folder1">
                <Component Id="NewTextFile0.txt" Guid="PUT-GUID-HERE">
                    <File Id="NewTextFile0.txt" KeyPath="yes" Source="$(var.sample)\Folder1\NewTextFile0.txt" />
                </Component>
            </Directory>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="CG_Sample">
            <ComponentRef Id="NewTextFile0.txt" />
        </ComponentGroup>
    </Fragment>
</Wix>

各ファイルの GUID を含むカスタム XML は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<FileSystemList>
  <File Path="\Programs\Folder1\NewTextFile0.txt" Guid="52B62A6E-DD87-424A-8296-3AA00E74AEF8" />
</FileSystemList>

したがって、ファイル名とできれば親フォルダーが両方の XML で一致する場合は、Guid="PUT-GUID-HERE「」を に置き換えてください。Guid="52B62A6E-DD87-424A-8296-3AA00E74AEF8"

XSL を理解しようとしていますが、達成できるのは脱毛だけです。私と私の残りの髪はどんな助けにも感謝します.

更新: これら 2 つの xml ファイル間の照合Sourceは、最初のファイルとPath2 番目のファイルで実行する必要があります。

Source="$(var.sample)\Folder1\NewTextFile0.txt"ファイル名 (NewTextFile0.txt) と親フォルダー (Folder1) は、プロジェクト内で一意です。同じことが、Path="\Programs\Folder1\NewTextFile0.txt"ファイル名と親フォルダーが一意であることにも当てはまります。

4

1 に答える 1

2

次のようなものを試してください:

<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" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- insert GUID -->    
<xsl:template match="wi:Component/@Guid">
    <xsl:variable name="path" select="concat(../../@Name, '\', ../@Id)" />
    <xsl:attribute name="Guid">
        <xsl:value-of select="document('FileList.xml')/FileSystemList/File[contains(@Path, $path)]/@Guid"/>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

編集:

の内容に基づいて一致させるには、変数Component/File/@Sourceの定義を次のように変更します。$path

<xsl:variable name="path" select="substring-after(../wi:File/@Source, ')')" />

Sourceこれは、最初の ")" の後に続く属性のすべてが、他のファイルに格納されているパスの一部であると想定しています。

于 2014-04-09T10:42:47.987 に答える