XSLT技术求助:两字段值相同时清空指定字段值
解决XSLT中清空重复手机号字段的问题
需求
当XML中同一<emp>节点内的EE_WORKMOBPH与EE_MOBPH字段值相同时,清空EE_WORKMOBPH的内容。
原始XML
<?xml version="1.0" encoding="UTF-8"?> <root> <emp> <EE_WORKMOBPH>123</EE_WORKMOBPH> <EE_MOBPH>123</EE_MOBPH> </emp> <emp> <EE_WORKPH>345</EE_WORKPH> <EE_WORKMOBPH>678</EE_WORKMOBPH> </emp> </root>
期望输出
<?xml version="1.0" encoding="UTF-8"?> <root> <emp> <EE_WORKMOBPH></EE_WORKMOBPH> <EE_MOBPH>123</EE_MOBPH> </emp> <emp> <EE_WORKPH>345</EE_WORKPH> <EE_WORKMOBPH>678</EE_WORKMOBPH> </emp> </root>
你的代码问题分析
当前XSLT存在几个关键问题:
- XML节点名称大小写敏感:你用了小写的
ee_workmobph,但实际XML里是大写的EE_WORKMOBPH,导致匹配失败。 - 条件判断路径错误:在匹配
text()节点时,ee_workbobph = ee_mobph是在当前文本节点下查找子节点,而非<emp>节点下的同层级节点,逻辑完全错误。 - 匹配目标不对:直接匹配文本节点无法保留元素结构,应该匹配
EE_WORKMOBPH元素本身来控制内容输出。
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.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> <xsl:strip-space elements="*"/> <!-- 专门处理EE_WORKMOBPH元素 --> <xsl:template match="EE_WORKMOBPH"> <xsl:copy> <!-- 判断同层级的EE_MOBPH值是否与当前元素值相等 --> <xsl:if test="not(. = ../EE_MOBPH)"> <xsl:value-of select="."/> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:保留XML原有结构,默认复制所有节点和属性,是XSLT处理中常用的基础模板。
- strip-space:移除所有元素的空白节点,避免输出多余空格。
- EE_WORKMOBPH匹配模板:
- 先复制元素本身,保证
<EE_WORKMOBPH>标签存在 - 通过
../EE_MOBPH获取当前元素父节点<emp>下的EE_MOBPH节点值 - 使用
not(. = ../EE_MOBPH)判断:若两个值不相等则保留原内容,相等则不输出任何内容,最终得到空元素标签。
- 先复制元素本身,保证
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

