使用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
相关产品推荐
相关产品推荐

