从 phone 数字中过滤字母和 phone 数字的 XSLT 函数

XSLT function to filter alphabets and phone number from phone number

我必须使用 XSLT 将 xml 日期转换为 csv。 phone 号码有一个字段,其中可能包含字母、space、国家代码(美国为 +1)以及特殊字符。我必须删除 space、特殊字符、国家代码和字母表,只保留 10 位数字值。我创建了下面的函数,它删除了除字母以外的这些。要删除两组字母 (2*26),如果我采用这种方法,我必须使用替换函数 52 次。

<xsl:function name="wd:gePhone">
        <xsl:param name="phone_number" />
        <xsl:if test="$phone_number !=' '" >
            <xsl:value-of select="normalize-space(replace(replace(replace(replace(replace(replace($phone_number,'-',''),'/',''),' ',''),'\)',''),'\(',''),'\+1',''))"/>
        </xsl:if>
    </xsl:function>

您应该使用一个字符 class:

,而不是多次调用替换,每次调用一个字符
replace(replace($num, 'a', ''), 'b', '')

可以改写为:

replace($num, '[ab]', '')

这可以与两个字符长的字符串 +1:

的替代项一起使用
replace($num, '[ab]|\+1', '')

并且在字符class中使用范围a-z可以匹配从A到Z的所有字符。因此,通过 space 规范化,重复使用与您的示例中相同的字符,它将是:

normalize-space(
   replace($num,'[-/,()a-zA-Z]|\+1',''))

注意字符-,因为它在2个字符之间的字符class中有特殊含义,如果是[之后的第一个字符就可以自己使用.

如果只需要替换单个字符,也可以使用translate()函数

translate($num, "-/ ()", "")
<xsl:variable name="vnumsOnly"
            select="translate(Phone_Field, translate(Phone_Field, '0123456789', ''), '')"/>
        <xsl:value-of select="substring($vnumsOnly, (substring($vnumsOnly, 1, 1) = '1') + 1)"/>