首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XSLT中使用regex替换字符串

在XSLT中使用regex替换字符串
EN

Stack Overflow用户
提问于 2014-03-18 08:39:18
回答 1查看 11.8K关注 0票数 0

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

代码语言:javascript
复制
<Sample>
<AccountNumber>37289882</AccountNumber>
<SortCode>789-88-8907</SortCode>
<CardNumber>4545-6767-9876-8764</CardNumber>
<address>j-89-8999</address>
</Sample>

我必须得到以下输出

代码语言:javascript
复制
<Sample>
    <AccountNumber>37289882</AccountNumber>
    <SortCode>789-xx-xxxx</SortCode>
    <CardNumber>4545-xxxx-xxxx-xxxx</CardNumber>
    <address>j-89-8999</address>
    </Sample>

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

代码语言:javascript
复制
678-87-2827(3 number-2 number-4 number)
 5253-2626-9808-8787(4 number-4 number-4 number-4 number)

我们得把它改成

代码语言:javascript
复制
678-xx-xxxx
  5253-xxxx-xxxx-xxxx

以下是我正在做的事情

代码语言:javascript
复制
<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>

我现在得到产出了

但是输出开始了两次

代码语言:javascript
复制
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>

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-03-18 09:02:09

下面的解决方案使用XSLT2.0。我知道样式表在XSLT1.0中,但我现在无法访问EXSLT扩展函数。

我希望regexp:matchregexp:replace函数与XSLT2.0功能没有太大不同,这样您就可以自己轻松地调整样式表。

样式表

代码语言:javascript
复制
<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>

输出

代码语言:javascript
复制
<?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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22474095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档