我需要使用XSLT将电话号码从+1 111-111-1234 x 7777777格式转换为11111111234。我试图使用translate('+'-'-'),但这会导致氧气错误。
谢谢
我敢肯定有一种使用正则表达式的更干净的方法,但这有效:
<xsl:variable name="phoneNumber" select="'+1 111-111-1234 x 7777777'"/>
<xsl:value-of select="replace(replace(substring-after(substring-before($phoneNumber,'x'),'+'),' ',''),'-','')"/>
因此,如果您将其分解:在“ x”之前的子字符串,在“ +”之后的子字符串,用'替换'',用“”替换“-”。
translate()
的签名是:translate()
从规范(上面的链接)中,它是“ 返回第二个参数字符串中出现的字符替换为第三个参数字符串中相应位置的字符的第一个参数字符串“]]
因此,如果要从字符串中删除数字以外的所有字符,则首先需要确定这些字符是什么:
translate(string, string, string)
如果 translate(.,'0123456789','')
的字符串值为.
,则得出字符串+1 111-111-1234 x 7777777
。
现在我们可以从+ -- x
中翻译出这些字符:
.
尽管我们可以做的是将两个translate(.,'+ -- x ','')
调用嵌套在一起,所以内部调用的输出将用作外部调用的第二个参数字符串:
translate()
这几乎给了我们所需的输出:
translate(.,translate(.,'0123456789',''),'')
但是我们还有多余的111111112347777777
。我们需要在外部调用中的7777777
之前获取字符串...
x
这将为我们提供所需的输出:
translate(substring-before(.,'x'),translate(.,'0123456789',''),'')
[注意:我们也可以在内部转换调用中使用11111111234
(这会导致substring-before
(注意+ --
遗失)),但实际上并不会改变输出。
这是一个完整的例子...
XML输入
x
XSLT 1.0(有关XSLT 2.0+选项,请参见另一个答案(以及对该答案的评论))
<test>+1 111-111-1234 x 7777777</test>
输出
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="test">
<xsl:copy>
<xsl:value-of select="translate(substring-before(.,'x'),
translate(.,'0123456789',''),'')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>