求助XSLT 2.0:排除特殊字符并保留空格分隔格式
解决方案
你的核心问题是原XSLT移除了所有非字母字符(包括分隔符),导致单词连在一起,同时需要拆分驼峰式大写单词、替换自定义分隔符xa,以及处理小写连写单词的拆分。以下是分场景的实现方案:
1. 基础处理(XSLT 2.0+)
如果使用XSLT 2.0或更高版本,可通过内置函数快速实现替换分隔符、拆分驼峰、整理空格:
<xsl:value-of select="normalize-space( replace( translate( replace(wd:CF_LRV_Primary_Address_Full_with_Country, 'xa', ' '), translate(replace(wd:CF_LRV_Primary_Address_Full_with_Country, 'xa', ' '), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ''), ' ' ), '(?<!^)([A-Z])', ' $1' ) )" />
这段代码的执行逻辑:
- 把原字符串中的
xa替换为空格,恢复分隔 - 将所有非字母字符统一替换为空格
- 在非开头的大写字母前添加空格,拆分驼峰式单词(如
UnitedStatesofAmerica→United States of America) - 合并连续空格、移除首尾空格,整理格式
2. 小写连写单词拆分(自定义规则)
对于forestviewcir→forest view cir、Franksville→Franks ville这类小写连写单词,XSLT没有内置分词能力,需添加自定义替换规则:
<xsl:value-of select="normalize-space( replace( replace( replace( translate( replace(wd:CF_LRV_Primary_Address_Full_with_Country, 'xa', ' '), translate(replace(wd:CF_LRV_Primary_Address_Full_with_Country, 'xa', ' '), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ''), ' ' ), '(?<!^)([A-Z])', ' $1' ), 'forestviewcir', 'forest view cir' ), 'Franksville', 'Franks ville' ) )" />
如果有大量类似连写单词,建议将规则整理到单独模板或<xsl:key>中,便于维护。
3. XSLT 1.0兼容方案
若只能使用XSLT 1.0,需用递归模板实现驼峰拆分:
首先定义驼峰拆分模板:
<xsl:template name="split-camelcase"> <xsl:param name="text" /> <xsl:if test="$text != ''"> <xsl:variable name="char" select="substring($text, 1, 1)" /> <xsl:if test="not(position()=1) and $char = translate($char, 'abcdefghijklmnopqrstuvwxyz', '')"> <xsl:text> </xsl:text> </xsl:if> <xsl:value-of select="$char" /> <xsl:call-template name="split-camelcase"> <xsl:with-param name="text" select="substring($text, 2)" /> </xsl:call-template> </xsl:if> </xsl:template>
然后执行完整处理:
<xsl:variable name="step1" select="translate(wd:CF_LRV_Primary_Address_Full_with_Country, 'xa', ' ')" /> <xsl:variable name="step2" select="translate($step1, translate($step1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ''), ' ')" /> <xsl:variable name="step3"> <xsl:call-template name="split-camelcase"> <xsl:with-param name="text" select="$step2" /> </xsl:call-template> </xsl:variable> <xsl:variable name="step4" select="normalize-space($step3)" /> <!-- 自定义单词拆分 --> <xsl:variable name="final" select="translate($step4, 'forestviewcir', 'forest view cir')" /> <xsl:variable name="final" select="translate($final, 'Franksville', 'Franks ville')" /> <xsl:value-of select="$final" />
注:XSLT 1.0无内置replace函数,若需更灵活的字符串替换,可额外编写递归替换模板,或使用EXSLT扩展(需处理器支持)。
内容的提问来源于stack exchange,提问作者Syed Imtiaz
相关产品推荐
相关产品推荐

