XSLT 1.0节点值条件替换需求求助(附XML示例)
XSLT 1.0 节点值替换解决方案
针对你需要的节点值替换逻辑,我们可以基于XSLT的身份转换模式来实现——先保留XML的整体结构,再对需要修改的节点单独处理,这样其他节点会自动原样保留。
以下是完整的XSLT 1.0代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:默认复制所有节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理BESKZ节点的替换逻辑 --> <xsl:template match="BESKZ"> <xsl:copy> <xsl:choose> <xsl:when test="text()='X'">NS_CFS</xsl:when> <xsl:when test="text()='E'">INV_CFS</xsl:when> <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <!-- 处理NAME节点的替换逻辑 --> <xsl:template match="NAME[normalize-space()!='']"> <xsl:copy>SERIAL</xsl:copy> </xsl:template> </xsl:stylesheet>
逻辑说明:
- 身份转换模板:这是XSLT的基础模板,会原样复制所有未被专门模板匹配的节点、属性和文本,保证XML结构不变,像
NUM1、DOC的属性这类节点会自动保留。 - BESKZ节点处理:
- 匹配所有
BESKZ节点,先复制节点本身 - 用
<xsl:choose>判断节点文本值:等于X时输出NS_CFS,等于E时输出INV_CFS,其他情况输出原节点值
- 匹配所有
- NAME节点处理:
- 只匹配非空的
NAME节点(用normalize-space()去掉前后空格后判断,避免纯空格的情况被误判) - 直接复制节点并替换内容为
SERIAL;如果NAME为空,则走身份模板保留原内容
- 只匹配非空的
测试验证
输入XML:
<?xml version="1.0" encoding="UTF-8"?> <DOC BEGIN="1"> <BESKZ>X</BESKZ> <NUM1>1010</NUM1> <NAME>ABC</NAME> </DOC>
转换后输出XML:
<?xml version="1.0" encoding="UTF-8"?> <DOC BEGIN="1"> <BESKZ>NS_CFS</BESKZ> <NUM1>1010</NUM1> <NAME>SERIAL</NAME> </DOC>
完全符合你期望的输出效果。
内容的提问来源于stack exchange,提问作者nicow
相关产品推荐
相关产品推荐

