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

使用XSLT结合Saxon9he实现XML条件数据掩码的开发问题

XML条件掩码功能实现方案

现有依赖配置

使用saxon9he作为XML处理依赖,配置如下:

<dependencies>
<dependency>
    <groupId>net.sf.saxon</groupId>
    <artifactId>saxon9he</artifactId>
    <version>9.4.0.4</version>
</dependency>
</dependencies>

输入XML示例

<ns3:Prsn>
  <ns3:FrstNm>BDMFN</ns3:FrstNm>
  <ns3:Nm>BDMSN</ns3:Nm>
  <ns3:BirthDt>2000-01-02</ns3:BirthDt>
  <ns3:Othr>
    <ns3:Id>GB1592102</ns3:Id>
    <ns3:SchmeNm>
      <ns3:Cd>CCPT</ns3:Cd>
    </ns3:SchmeNm>
  </ns3:Othr>
</ns3:Prsn>

已实现的基础掩码逻辑

已完成FrstNm、Nm、BirthDt三个节点的掩码,原有XSLT如下(注:replace为XSLT 2.0函数,已将版本声明调整为2.0适配saxon9he的能力):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='FrstNm']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[A-Za-z]','#')" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='Nm']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[A-Za-z]','#')" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='BirthDt']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[0-9]','#')" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

条件掩码实现方法

只需在原有XSLT中新增如下模板即可实现需求:

<xsl:template match="*[local-name()='Id'][../*[local-name()='SchmeNm']/*[local-name()='Cd'] = ('NIND', 'CCPT', 'CONCAT')]">
  <xsl:copy>
    <xsl:value-of select="replace(text(), '[A-Za-z0-9]','#')" />
  </xsl:copy>
</xsl:template>

逻辑说明

  • 模板仅匹配满足条件的Id节点:同属Othr节点下的SchmeNm/Cd值为NIND/CCPT/CONCAT三者之一
  • 匹配到的节点会将所有字母、数字替换为#,未匹配到的Id节点会走默认的复制逻辑,内容不做修改

完整最终XSLT代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='FrstNm']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[A-Za-z]','#')" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='Nm']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[A-Za-z]','#')" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[local-name()='BirthDt']">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[0-9]','#')" />
    </xsl:copy>
  </xsl:template>

  <!-- 新增条件掩码逻辑 -->
  <xsl:template match="*[local-name()='Id'][../*[local-name()='SchmeNm']/*[local-name()='Cd'] = ('NIND', 'CCPT', 'CONCAT')]">
    <xsl:copy>
      <xsl:value-of select="replace(text(), '[A-Za-z0-9]','#')" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:24:04