You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:06:26