我使用来自Wix工具集的Heat为我的安装程序生成组件,但我的安装程序很少是每用户,因此我无法使用Heat的Autogenerate Guids。我可以随机生成GUID,但由于组件规则,我不希望这样。
所以我有一个带有文件列表的XML,这些文件应该包含在安装中,而不是生成的文件列表,我为每个文件添加了静态guid。
我想要做的是匹配我的XML和生成的XML之间的filename
,并将GUID插入到我生成的XML中。
以下是没有任何转换的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>
这是我的自定义XML,每个文件都有GUID:
<?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,但我能够实现的是脱发。我和我剩下的头发会感激任何帮助。
更新:
应在第一个文件的Source
和第二个文件的Path
上执行这两个xml文件之间的匹配。
Source="$(var.sample)\Folder1\NewTextFile0.txt"
文件名(NewTextFile0.txt)和父文件夹(Folder1)在项目中是唯一的。
Path="\Programs\Folder1\NewTextFile0.txt"
文件名和父文件夹是唯一的。
答案 0 :(得分: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
属性中的任何内容都是存储在另一个文件中的路径的一部分。