Xslt XSL 2.0:用u到CamelCase格式化字符串

Xslt XSL 2.0:用u到CamelCase格式化字符串,xslt,Xslt,我使用XSLT2.0作为java代码生成器。现在我有一个XML,它描述了一个数据库表,我想为它生成entitiy类 表的列名始终为小写,单词之间带有u。 示例:bat_valid_from 我想在Java类中将其重命名为camelcase,首字母小写 示例:batValidFrom 因为我经常需要在我的codeGen中使用这种安静,所以我喜欢为它设置一个函数。 但我只能通过两个子功能来实现这一点 <xsl:function name="local:VarName"> <

我使用XSLT2.0作为java代码生成器。现在我有一个XML,它描述了一个数据库表,我想为它生成entitiy类

表的列名始终为小写,单词之间带有u。 示例: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:我还没有发布完整的代码来缩短这个问题

XSLT/XPath 2.0提供的支持。您可以这样做:

string-join(
  for $part in tokenize($input, '_')
  return concat(
    upper-case(substring($part, 1, 1)),
    substring($part, 2)
  )
, '')
如果$input设置为“bat_valid_from”,则此表达式将生成“BatValidFrom”


我将保留首字母的小写或不大写作为练习。

XSLT/XPath 2.0提供了支持。您可以这样做:

string-join(
  for $part in tokenize($input, '_')
  return concat(
    upper-case(substring($part, 1, 1)),
    substring($part, 2)
  )
, '')
如果$input设置为“bat_valid_from”,则此表达式将生成“BatValidFrom”


我将把首字母的大小写保留下来作为练习。

根据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>

在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>

谢谢你的回答,我以前从未收到过FLWOR的来信。您需要额外的标记来定义它们吗?或者干脆在XSLT代码中编写?因为当我使用这段代码时,它只是把它打印成文本。或者我需要一个FLWOR处理器吗?它是XPath。在XQuery中使用XPath时,它也是XPath,但在本例中,它是XSLT中使用的XPath。概念重叠。XSLT2.0不支持XQuery,它支持XPath2.0。XPath 2支持,它们本身是XQuery中FLUWOR表达式的子集。我不认为W3Cube可信。但这不是重点。我给出了XPath2.0规范的链接。如果你读了任何东西,请读它。这就是为什么我说它是XPath,而不是XQuery,并将规范的一部分与表达式的标题链接起来。但我明白称他们为FLWOR是不合适的。我正在更改答案文本。谢谢你的回答,我以前从未收到过FLWOR的来信。您需要额外的标记来定义它们吗?或者干脆在XSLT代码中编写?因为当我使用这段代码时,它只是把它打印成文本。或者我需要一个FLWOR处理器吗?它是XPath。在XQuery中使用XPath时,它也是XPath,但在本例中,它是XSLT中使用的XPath。概念重叠。XSLT2.0不支持XQuery,它支持XPath2.0。XPath 2支持,它们本身是XQuery中FLUWOR表达式的子集。我不认为W3Cube可信。但这不是重点。我给出了XPath2.0规范的链接。如果你读了任何东西,请读它。这就是为什么我说它是XPath,而不是XQuery,并将规范的一部分与表达式的标题链接起来。但我明白称他们为FLWOR是不合适的。我正在更改答案文本。提示:将中间结果保存为一个值,这样就不必计算两次。或者,您也可以将substring before和substring after组合起来,以不同方式处理第一个之前的位。提示:将中间结果保存到中,这样您就不必计算两次。或者,您可以组合子字符串before和substring after,以不同方式处理第一个前的位。