我正在使用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:我没有发布完整的代码来缩短问题
答案 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>