【发布时间】:2014-04-09 09:13:52
【问题描述】:
我使用来自 Wix 工具集的 Heat 为我的安装程序生成组件,但我的安装程序很少是 Per-User,因此我无法使用 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,但我所能实现的只是脱发。我和我剩下的头发将不胜感激。
更新:
这两个xml文件的匹配应该在第一个文件的Source和第二个文件的Path上进行。
Source="$(var.sample)\Folder1\NewTextFile0.txt" 文件名(NewTextFile0.txt)和父文件夹(Folder1)在一个项目中是唯一的。
Path="\Programs\Folder1\NewTextFile0.txt" 文件名和父文件夹也是唯一的。
【问题讨论】:
-
您使用 XSLT 1.0 处理器还是 XSLT 2.0 处理器(如 Saxon 9)?使用 XSLT 2.0,很简单地分解一个字符串并比较像该文件路径这样的子字符串,并且很容易在文档之间交叉引用,而使用 XSLT 1.0,因为基于子串很难表达。
-
不幸的是它是 1.0 版