如何用XSLT处理LDAP电话号码:插入*生成两种输出
XSLT实现电话号码双格式输出解决方案
需求:基于LDAP返回的telephoneNumber值生成两种输出结果:
- 保留原号码(如输入
8989输出8989) - 在号码第二位插入
*(如输入8989输出8*989)
原有单输出代码
<Extension> <xsl:value-of select="telephonenumber"/> </Extension>
尝试代码的问题
你之前用xsl:for-each循环并直接输出#*###的方式无效,因为这只是静态文本,无法根据实际号码动态生成格式化内容。要实现需求,需要通过字符串截取拼接或正则替换来处理。
解决方案
方案1:XSLT 1.0 实现
XSLT 1.0需借助substring和concat函数完成字符串拼接:
<!-- 输出原号码 --> <Extension> <xsl:value-of select="telephonenumber"/> </Extension> <!-- 输出第二位插入*的格式 --> <Extension> <xsl:value-of select="concat(substring(telephonenumber, 1, 1), '*', substring(telephonenumber, 2))"/> </Extension>
substring(telephonenumber, 1, 1):提取号码的第一个字符concat:将第一个字符、*、从第二个字符开始的剩余内容拼接为新字符串
如果需要处理多个telephoneNumber节点,用xsl:for-each循环包裹:
<xsl:for-each select="telephoneNumber"> <!-- 原号码 --> <Extension> <xsl:value-of select="."/> </Extension> <!-- 格式化后号码 --> <Extension> <xsl:value-of select="concat(substring(., 1, 1), '*', substring(., 2))"/> </Extension> </xsl:for-each>
方案2:XSLT 2.0+ 实现
XSLT 2.0及以上支持replace正则函数,写法更简洁:
<xsl:for-each select="telephoneNumber"> <!-- 原号码 --> <Extension> <xsl:value-of select="."/> </Extension> <!-- 格式化后号码 --> <Extension> <xsl:value-of select="replace(., '^(.)', '$1*')"/> </Extension> </xsl:for-each>
replace(., '^(.)', '$1*'):用正则匹配号码的第一个字符,替换为「第一个字符+*」,实现插入效果
内容的提问来源于stack exchange,提问作者Scutch
相关产品推荐
相关产品推荐

