【发布时间】:2016-08-13 05:34:50
【问题描述】:
我需要将传入的电话号码字符串转换为没有任何非数字字符的标准化格式,如果它是 1,则去掉前导数字。
例如:
“+1 (222) 333-4444 x 5555”变为“22233344445555”
提前感谢您的帮助!
【问题讨论】:
标签: xslt transformation
我需要将传入的电话号码字符串转换为没有任何非数字字符的标准化格式,如果它是 1,则去掉前导数字。
例如:
“+1 (222) 333-4444 x 5555”变为“22233344445555”
提前感谢您的帮助!
【问题讨论】:
标签: xslt transformation
我。 XSLT 1.0 解决方案:
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="text()">
<xsl:variable name="vnumsOnly" select=
"translate(., translate(.,'0123456789',''), '')
"/>
<xsl:value-of select=
"substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)"/>
</xsl:template>
</xsl:stylesheet>
应用于此 XML 文档时:
<t>"+1 (222) 333-4444 x 5555</t>
产生想要的正确结果:
22233344445555
解释:
表达式:translate(.,'0123456789','') 被评估为包含当前节点中所有非数字字符的字符串。
我们在表达式中使用 1. above:
翻译(., 翻译(.,'0123456789',''), '')
这将计算为一个字符串,其中删除了当前节点中的所有非数字字符。
.3。表达式:如果$vnumsOnly 的第一个字符是'1',则(substring($vnumsOnly,1,1)='1') +1)" 的计算结果为2,如果起始字符不是'1',它的计算结果为1。
.4。我们在下面的表达式中使用 3.:
substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)
如果不是以“1”开头,则计算为相同的字符串$vnumsOnly,如果第一个字符为“1”,则计算为从第二个字符开始的子字符串。
二。 XPath 2.0 解决方案:
只需使用:
replace(replace(., '[^0-9]', ''), '^1', '')
内部替换删除所有不是 0 到 9(数字)的字符。外部替换删除前导 1(如果存在)。
【讨论】:
translate($phone,'0123456789'+$phone,'0123456789') 而不是 translate(., translate(.,'0123456789',''), '') 哪个更好?
这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="vPhone"
select="translate(Phone,translate(Phone,'0123456789',''),'')"/>
<xsl:value-of
select="substring($vPhone, 1 + starts-with($vPhone,'1'))"/>
</xsl:template>
</xsl:stylesheet>
有了这个输入:
<Phone>+1 (222) 333-4444 x 5555</Phone>
输出:
22233344445555
【讨论】:
replace(replace(., '[^1-9]', ''), '^1', '') - 我正在回应这个...而不是 [^1-9]...使用 [^0-9] 否则电话号码中的任何 0 都会被删除。但除此之外,这很好地解决了我的 Workday 集成问题!
【讨论】:
您可以使用嵌套的replace xpath 函数。如果第一个数字是 1,内部人员会将第一个数字更改为空格,外部人员会将非数字更改为空格。
【讨论】: