如何通过xslt屏蔽传入请求中的中间值。例如,我的传入请求字段是
<CreditCardNumber>0123456789</CreditCardNumber>
,输出应为
<CreditCardNumber>012**56789</CreditCardNumber> .
我能够实现使用此输出
<CreditCardNumber>012***56789</CreditCardNumber>
通过此代码
<xsl:value-of select="replace(.,substring(.,$length -6 , 2),'*')"/>
但问题是它只显示两个位置的一个蒙版值,那么我们如何才能使这个动态化呢?
答案 0 :(得分:0)
假设“中间值”表示输入的第4个和第5个字符,您可以使用:
<xsl:value-of select="replace(input, '^(.{3}).{2}', '$1**')"/>
注意强>:
使用substring()
来识别要屏蔽的输入部分是有问题的。
<xsl:value-of select="replace(input, substring(., string-length(.) - 6 , 2),'**')"/>
将返回给定示例的预期012**56789
结果。
但是,当输入为0123456349
时,结果将为012**56**9
。
如果您希望掩码的 start 和 length 是变量,那么您可以使用:
<xsl:value-of select="substring(input, 1, $start - 1)"/>
<xsl:value-of select="replace(substring(input, $start, $length), '.', '*')"/>
<xsl:value-of select="substring(input, $start + $length)"/>
在这种情况下,将其转换为功能可能是值得的:
<xsl:function name="my:mask">
<xsl:param name="string" as="xs:string"/>
<xsl:param name="start" as="xs:integer"/>
<xsl:param name="length" as="xs:integer"/>
<xsl:variable name="char" select="'*'"/>
<xsl:value-of select="substring($string, 1, $start - 1)"/>
<xsl:value-of select="replace(substring($string, $start, $length), '.', $char)"/>
<xsl:value-of select="substring($string, $start + $length)"/>
</xsl:function>
演示:http://xsltransform.net/ncdD7mS/1
XSLT 1.0
要在XSLT 1.0(使用合适的处理器,如DataPower)中工作,您可以使用:
<xsl:value-of select="substring(input, 1, $start - 1)"/>
<xsl:value-of select="str:padding($length, '*')"/>
<xsl:value-of select="substring(input, $start + $length)"/>
或者,在纯XSLT 1.0中(假设输入只包含数字):
<xsl:value-of select="substring(input, 1, $start - 1)"/>
<xsl:value-of select="translate(substring(input, $start, $length), '0123456789', '**********')"/>
<xsl:value-of select="substring(input, $start + $length)"/>