Wix Installer通过XSLT为.wxs文件File节点添加DiskId属性失效排查
问题原因
你的XSLT运行后没有修改内容,核心原因是XML命名空间匹配失效:
- 你的.wxs源文件根节点声明了默认命名空间
xmlns="http://schemas.microsoft.com/wix/2006/wi",文件内所有无前缀的元素(包括Wix、Fragment、Component、File等)都属于这个命名空间。 - 你写的XPath匹配规则
Component/File只会匹配无命名空间的对应元素,虽然你在XSLT头部声明了wix前缀绑定WiX命名空间,但匹配路径里没有使用这个前缀修饰元素名,所以根本匹配不到任何File节点,整个转换过程完全走通用的identity复制模板,输出和原文件完全一致。
另外你原来的File节点匹配模板里,xsl:apply-templates只选择了属性@*,如果File节点下存在子节点会直接丢失,逻辑也有小缺陷。
修正方案
把匹配路径里的所有WiX元素都加上你声明的wix前缀,同时补全节点复制逻辑、清理多余命名空间输出即可,修正后的完整XSLT如下:
<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 wix" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"> <xsl:output method="xml" indent="yes" /> <xsl:strip-space elements="*"/> <xsl:template match='wix:Component/wix:File'> <xsl:copy> <xsl:apply-templates select="@*|node()"/> <xsl:attribute name="DiskId">2</xsl:attribute> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
修正说明
- 匹配规则改为
wix:Component/wix:File,可以准确命中WiX命名空间下的目标File节点 - 给
File模板的xsl:apply-templates补充node()选择,确保节点下原有子内容不会丢失 - 在
exclude-result-prefixes中加入wix,避免转换后的XML输出多余的wix前缀声明,输出格式和你预期完全一致 - 简化了
DiskId属性的赋值写法,不需要额外套xsl:text也能正常输出属性值
运行这个修正后的XSLT,就能得到你期望的、所有File节点都带上DiskId="2"属性的.wxs文件。
内容的提问来源于stack exchange,提问作者Skate_and_Create
相关产品推荐
相关产品推荐

