XSL 2.0:以_格式将字符串格式化为CamelCase

时间:2018-10-13 10:44:55

标签: xslt

我正在使用XSLT(2.0)作为Java代码生成器。目前,我有一个描述数据库表的XML,我想为其生成实体类。

表的列名始终为小写,单词之间用_。
示例:bat_valid_from
我想在Java类中将其重命名为带有首字母小写的camelcase
示例:batValidFrom

因为我经常在codeGen中需要这种安静的环境,所以我喜欢为其提供功能。 但是我只能通过两个子函数来实现。

<xsl:function name="local:VarName">
    <xsl:param name="columnName"/>
    <xsl:value-of select="lower-case(substring($columnName,1,1))"/>
    <xsl:value-of select="substring(local:VarName_sub($columnName),2)"/>
</xsl:function>
<xsl:function name="local:VarName_sub">
    <xsl:param name="columnName"/>
    <xsl:value-of select="local:VarName_sub_sub($columnName)"/>
</xsl:function>
<xsl:function name="local:VarName_sub_sub">
    <xsl:param name="columnName"/>
    <xsl:for-each select="tokenize($columnName, '_')">
        <xsl:value-of select="upper-case(substring(.,1,1))"/>
        <xsl:value-of select="substring(.,2)"/>
    </xsl:for-each>
</xsl:function>

也许有人有一个简化的想法?
没有子功能,我会收到以下错误:
fn:substring()的第一个参数不允许包含多个项目的序列。

PS:我没有发布完整的代码来缩短问题

2 个答案:

答案 0 :(得分:2)

XSLT / XPath 2.0支持for expressions。您可以这样做:

string-join(
  for $part in tokenize($input, '_')
  return concat(
    upper-case(substring($part, 1, 1)),
    substring($part, 2)
  )
, '')

,将$input设置为'bat_valid_from',此表达式将产生'BatValidFrom'

我要把下字母(而不是上字母)作为练习的字母。

答案 1 :(得分:2)

在Tomalak的提示下,我能够一次完成所有功能。
也许不是轻量级的,但是却像魅力一样。

<xsl:function name="local:VarName">
    <xsl:param name="columnName"/>
    <xsl:value-of select="
        concat(
            lower-case(substring($columnName, 1, 1)),
            substring(string-join(for $word in tokenize($columnName, '_')
                                      return concat(
                                          upper-case(substring($word, 1, 1)),
                                          substring($word, 2)), '')
                     , 2))" />
</xsl:function>