我有一个无法控制输入数据的场景,例如,我的输入可以是
<phoneNumber>6504323957</phoneNumber>
或
<phoneNumber>650-432-3957</phoneNumber>
或
<phoneNumber>(650)432-3957</phoneNumber>
或
<phoneNumber>650.432.3957</phoneNumber>
但是我的输出应该总是像这样
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
我正在尝试使用以下xsl实现此目的,该xsl仅适用于一种不适用于其他条件的情况。
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:element name="areaCode">
<xsl:value-of select="substring(phoneNumber,1,3)"/>
</xsl:element>
<xsl:element name="phoneNumber">
<xsl:value-of select="substring(phoneNumber,5,12)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
任何帮助都将受到高度赞赏。
谢谢!
答案 0 :(得分:2)
尝试
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="numbersonly" select="translate(phoneNumber, translate(phoneNumber,'0123456789',''), '')"/>
<xsl:element name="areaCode">
<xsl:value-of select="substring($numbersonly,1,3)"/>
</xsl:element>
<xsl:element name="phoneNumber">
<xsl:value-of select="substring($numbersonly,4,3)"/>-<xsl:value-of select="substring($numbersonly,7,4)"/>
</xsl:element>
</xsl:template>
要处理没有区号的输入,你可以使用一些简单的数学,并从右边而不是从左边选择(假设一个完整的手机是10位数)..
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="numbersonly" select="translate(phoneNumber, translate(phoneNumber,'0123456789',''), '')"/>
<xsl:variable name="length" select="string-length($numbersonly)"/>
<xsl:element name="areaCode">
<xsl:value-of select="substring($numbersonly,$length -9,3)"/>
</xsl:element>
<xsl:element name="phoneNumber">
<xsl:value-of select="substring($numbersonly,$length -6,3)"/>-<xsl:value-of select="substring($numbersonly,$length -3,4)"/>
</xsl:element>
</xsl:template>
答案 1 :(得分:2)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="phoneNumber">
<xsl:variable name="vbareNum" select="translate(.,'-().','')"/>
<areaCode><xsl:value-of select="substring($vbareNum,1,3)"/></areaCode>
<phoneNumber>
<xsl:value-of select=
"concat(substring($vbareNum,4,3),'-',substring($vbareNum,7))"/>
</phoneNumber>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档时:
<nums>
<phoneNumber>6504323957</phoneNumber>
<phoneNumber>650-432-3957</phoneNumber>
<phoneNumber>(650)432-3957</phoneNumber>
<phoneNumber>650.432.3957</phoneNumber>
</nums>
生成想要的正确结果:
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>