如何基于元素当前属性值重写属性?XSLT修改属性错位原因求解
问题原因
你写的match="wix:File"模板存在两个核心问题:
- 你没有在模板内显式复制
<File>节点本身,匹配到<File>节点后,模板直接输出了Source属性,没有创建新的<File>元素承载这个属性 - 你没有配置默认的「身份转换模板」,导致除了你自定义匹配逻辑外的其他节点/属性没有被正常递归复制
此时你输出的游离属性会自动挂载到当前输出上下文的父节点(也就是<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
相关产品推荐
相关产品推荐

