如何通过xslt

时间:2016-02-04 09:26:54

标签: xml xslt xslt-2.0

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

<CreditCardNumber>0123456789</CreditCardNumber> 

,输出应为

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

我能够实现使用此输出

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

通过此代码

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

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

1 个答案:

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