XSLT如何根据元素属性值修改对应元素的文本内容
问题原因
你当前自定义模板的匹配对象是@attribute,即所有名为attribute的属性节点,因此逻辑只会修改属性值,不会改动元素的文本内容,和预期目标完全错位。
修正方案
保留原有的身份复制模板(保证其余节点原样输出),删除原有匹配@attribute的错误模板,新增一条匹配规则:定位所有携带attribute="Delete"属性的元素的直接文本子节点,将这类文本替换为REMOVED即可。
注意示例中<Entry2 attribute="Delete"/>这类空元素本身没有文本子节点,不会被规则命中,属性会原样保留,刚好符合输出要求。
修正后完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 通用身份复制模板:无特殊规则的节点全部原样输出 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 替换带attribute="Delete"属性元素的文本内容 --> <xsl:template match="*[@attribute='Delete']/text()"> <xsl:text>REMOVED</xsl:text> </xsl:template> </xsl:stylesheet>
执行效果
运行上述代码后输出结果和预期完全一致:
- 所有
attribute属性的值不会被修改,保留原有Delete/Update取值 - 携带
attribute="Delete"且包含文本内容的元素,内部文本统一替换为REMOVED - 携带
attribute="Update"属性的元素不受任何影响,内容保持原样 - 空元素(如
<Entry2 attribute="Delete"/>)无文本子节点,不会被改动,结构和属性完全保留。
内容的提问来源于stack exchange,提问作者demi
相关产品推荐
相关产品推荐

