使用标识转换与单匹配语句多谓词实现XML节点静默及元素重映射
XSLT 解决方案
核心思路是基于标识转换,针对目标节点编写定向处理模板:
- 基础标识转换模板:默认复制所有节点、属性和文本,保证未指定的内容原样输出
- 专门模板移除
<CalculatedField>节点 - 条件模板处理
<CtgyPurp>节点,根据双条件决定修改或移除
以下是完整的XSLT代码:
<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> <!-- 完全移除<CalculatedField>节点 --> <xsl:template match="CalculatedField"/> <!-- 条件处理<CtgyPurp>节点 --> <xsl:template match="CtgyPurp"> <!-- 检查双条件:<Ctry>值为"NL" 且 <CalculatedField>值为"AD_HOC" --> <xsl:if test="ancestor::CdtTrfTxInf//Ctry = 'NL' and ancestor::CdtTrfTxInf//CalculatedField = 'AD_HOC'"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:for-each select="node()"> <xsl:choose> <xsl:when test="local-name() = 'Cd'"> <Cd>SALA</Cd> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:copy> </xsl:if> <!-- 条件不满足时,不输出<CtgyPurp>节点 --> </xsl:template> </xsl:stylesheet>
代码说明:
- 标识转换模板确保除了被专门匹配的节点外,所有内容都原样保留
- 匹配
<CalculatedField>的模板无输出,直接实现节点移除 - 匹配
<CtgyPurp>的模板中,通过ancestor::CdtTrfTxInf//路径定位上层的<Ctry>和<CalculatedField>节点(可根据实际XML结构调整路径):- 双条件同时满足时,复制
<CtgyPurp>并将其下的<Cd>文本替换为"SALA" - 条件不满足时,模板无输出,相当于移除
<CtgyPurp>节点
- 双条件同时满足时,复制
内容的提问来源于stack exchange,提问作者J_Cus504
相关产品推荐
相关产品推荐

