You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

代码说明

  1. 身份模板:保留XML原有结构,默认复制所有节点和属性,是XSLT处理中常用的基础模板。
  2. strip-space:移除所有元素的空白节点,避免输出多余空格。
  3. EE_WORKMOBPH匹配模板:
    • 先复制元素本身,保证<EE_WORKMOBPH>标签存在
    • 通过../EE_MOBPH获取当前元素父节点<emp>下的EE_MOBPH节点值
    • 使用not(. = ../EE_MOBPH)判断:若两个值不相等则保留原内容,相等则不输出任何内容,最终得到空元素标签。

内容的提问来源于stack exchange,提问作者Krishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:01:01