XSL 2.0: форматирование строки с _ в CamelCase - PullRequest
0 голосов
/ 13 октября 2018

Я использую XSLT (2.0) в качестве генератора кода Java.На данный момент у меня есть XML, который описывает таблицу базы данных, и я хочу сгенерировать для нее класс полномочий.

Имена столбцов таблицы всегда в нижнем регистре с _ между словами.
Пример: bat_valid_from
Я хочу переименовать его в Java-классе в camelcase с первой буквы в нижнем регистре
Пример: batValidFrom

Поскольку в коде часто требуется эта тишина, мне нравится иметь для нее функцию.Но я мог бы достичь этого только с двумя подфункциями.

<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 голосов
/ 13 октября 2018

С подсказкой Томалака я смог сделать все в одной функции.
Возможно, не легкий, но работает как шарм.

<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>
0 голосов
/ 13 октября 2018

XSLT / XPath 2.0 поддерживает for выражений .Вы можете сделать это:

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

с $input, установленным на 'bat_valid_from', это выражение будет выдавать 'BatValidFrom'.

Я оставляю заглавную (или не заглавную) начальную букву в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...