XML XSLT规则:如何为转换后的连续文本添加空格?
解决驼峰式字符串添加空格的XSL方案
嘿,这事儿我熟!你现在拿到的是典型的驼峰式拼接字符串,要拆分它其实就是在每个大写字母(除了第一个)前面插入空格就行。下面分两种常用的XSLT版本给你具体解法:
如果你用的是XSLT 2.0及以上版本
这版本支持正则表达式,用replace()函数就能一行搞定,超方便:
<!-- 直接在每个大写字母前加空格,注意开头会多一个空格 --> <xsl:value-of select="replace(your-target-node/text(), '([A-Z])', ' $1')"/> <!-- 如果想去掉开头多余的空格,用normalize-space或者substring处理 --> <xsl:value-of select="normalize-space(replace(your-target-node/text(), '([A-Z])', ' $1'))"/> <!-- 或者 --> <xsl:value-of select="substring(replace(your-target-node/text(), '([A-Z])', ' $1'), 2)"/>
把your-target-node/text()换成你实际获取那个连续字符串的XPath就行,比如你的源节点是<surgeries>keratopathySurgeries...</surgeries>,就写成//surgeries/text()。
如果你用的是XSLT 1.0版本(无原生正则支持)
那得写个递归模板来逐个字符处理,思路是检查每个字符,如果是大写且不是第一个字符,就插入空格:
<!-- 定义递归模板 --> <xsl:template name="insert-spaces-between-camelcase"> <xsl:param name="input-text"/> <xsl:param name="previous-char" select="''"/> <xsl:if test="$input-text != ''"> <xsl:variable name="current-char" select="substring($input-text, 1, 1)"/> <!-- 如果当前字符是大写,且不是第一个字符,插入空格 --> <xsl:if test="$previous-char != '' and $current-char = translate($current-char, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"> <xsl:text> </xsl:text> </xsl:if> <xsl:value-of select="$current-char"/> <!-- 递归处理剩下的字符 --> <xsl:call-template name="insert-spaces-between-camelcase"> <xsl:with-param name="input-text" select="substring($input-text, 2)"/> <xsl:with-param name="previous-char" select="$current-char"/> </xsl:call-template> </xsl:if> </xsl:template> <!-- 调用模板的方式 --> <xsl:call-template name="insert-spaces-between-camelcase"> <xsl:with-param name="input-text" select="your-target-node/text()"/> </xsl:call-template>
这个模板会遍历字符串的每个字符,遇到大写字母(且不是第一个)就自动插空格,最终输出就是带空格的拆分结果:keratopathy Surgeries Lensectomy Lensectomy Trabeculectomy Trabeculotomy Trabeculotomy Ahmed。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

