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

如何基于元素当前属性值重写属性?XSLT修改属性错位原因求解

问题原因

你写的match="wix:File"模板存在两个核心问题:

  1. 你没有在模板内显式复制<File>节点本身,匹配到<File>节点后,模板直接输出了Source属性,没有创建新的<File>元素承载这个属性
  2. 你没有配置默认的「身份转换模板」,导致除了你自定义匹配逻辑外的其他节点/属性没有被正常递归复制
    此时你输出的游离属性会自动挂载到当前输出上下文的父节点(也就是<Component>节点)上,同时原有的<File>节点会被完全丢弃,就出现了你遇到的现象。

正确的转换代码示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">

    <!-- 身份转换模板:默认复制所有节点和属性 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 自定义File节点匹配逻辑 -->
    <xsl:template match="wix:File">
        <!-- 先复制当前File节点本身 -->
        <xsl:copy>
            <!-- 复制除Source外的所有原有属性 -->
            <xsl:apply-templates select="@*[name()!='Source']"/>
            <!-- 生成修改后的Source属性 -->
            <xsl:attribute name="Source">
                <xsl:value-of select="concat(substring(@Source,0,19), '..\artifacts\msi\web\', substring(@Source, 20))"/>
            </xsl:attribute>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

内容的提问来源于stack exchange,提问作者Dbl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:09:03