You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:44:51