在XSLT中使用正则表达式替换字符串

时间:2014-03-18 08:39:19

标签: xml regex xslt

我正在使用datapower xi50,以下是我的输入xml

<Sample>
<AccountNumber>37289882</AccountNumber>
<SortCode>789-88-8907</SortCode>
<CardNumber>4545-6767-9876-8764</CardNumber>
<address>j-89-8999</address>
</Sample>

我必须得到以下输出

<Sample>
    <AccountNumber>37289882</AccountNumber>
    <SortCode>789-xx-xxxx</SortCode>
    <CardNumber>4545-xxxx-xxxx-xxxx</CardNumber>
    <address>j-89-8999</address>
    </Sample>

特别是每当我们有以下格式时 -

678-87-2827(3 number-2 number-4 number)
 5253-2626-9808-8787(4 number-4 number-4 number-4 number)

我们必须将其更改为

678-xx-xxxx
  5253-xxxx-xxxx-xxxx

以下是我正在做的事情

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="dp" 
exclude-result-prefixes="dp">
<xsl:template match="/"> 
<xsl:value-of select="regexp:replace(string(.), '-\d{2}-\d{4}', 'i', '-xx-xxxx')"/>
<xsl:value-of select="regexp:replace(string(.), '-\d{4}-\d{4}-\d{4}', 'i', '-xxxx-xxxx-xxxx')"/>
</xsl:template> 
</xsl:stylesheet>

我现在正在获得输出

但输出正在两次

37289882
789-xx-xxxx
4545-6767-9876-8764
j-89-8999

37289882
789-88-8907
4545-xxxx-xxxx-xxxx
j-89-8999

是因为两次<xsl:value-of select>

由于

1 个答案:

答案 0 :(得分:2)

以下解决方案使用XSLT 2.0。我知道您的样式表在XSLT 1.0中,但我现在无法访问EXSLT扩展函数。

我希望regexp:matchregexp:replace函数与XSLT 2.0功能没有太大差别,这样您就可以自己轻松调整样式表。

<强>样式表

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

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

<xsl:template match="/Sample|Sample/*"> 
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="text()">
    <xsl:choose>
        <xsl:when test="matches(.,'(\d{3})-(\d{2})-(\d{4})') or matches(.,'(\d{4})-(\d{4})-(\d{4})-(\d{4})')">
            <xsl:value-of select="concat(substring-before(.,'-'),'-',replace(substring-after(.,'-'),'\d','x'))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<Sample>
   <AccountNumber>37289882</AccountNumber>
   <SortCode>789-xx-xxxx</SortCode>
   <CardNumber>4545-xxxx-xxxx-xxxx</CardNumber>
   <address>j-89-8999</address>
</Sample>