3

我有一个无法控制输入数据的场景,例如我的输入可以是

<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: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>
4

2 回答 2

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>
于 2012-12-14T01:12:26.410 回答
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>
于 2012-12-14T01:19:36.383 回答