如何通过 xslt 屏蔽传入请求中的中间值

how can I mask the mid values in incoming request via xslt

如何通过 xslt 屏蔽传入请求中的中间值。例如,我的传入请求字段是

<CreditCardNumber>0123456789</CreditCardNumber> 

输出应该是

<CreditCardNumber>012**56789</CreditCardNumber> .  

我可以使用这个输出实现

<CreditCardNumber>012***56789</CreditCardNumber> 

通过此代码

<xsl:value-of select="replace(.,substring(.,$length -6 , 2),'*')"/>

但问题是它只显示两个位置的一个掩码值,那么我们如何才能使其动态化?

假设"mid values"表示输入的第4个和第5个字符,你可以使用:

<xsl:value-of select="replace(input, '^(.{3}).{2}', '**')"/>

:

使用substring() 来识别要屏蔽的输入部分是有问题的。

<xsl:value-of select="replace(input, substring(., string-length(.) - 6 , 2),'**')"/>

将return预期的012**56789结果与给定的例子。

但是,当输入为 0123456349 时,结果将为 012**56**9


已添加:

如果你想让mask的startlength成为变量,那么你可以使用:

<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)"/>