2

XSL ファイルに次の要素がある場合:

<xsl:value-of select="replace(lower-case(@name), '_([a-z0-9])', '$1')" />

たとえば、「get_polygene_lubricants」から「getpolygenelubricants」を作成します。

私がやりたいのは、「_」の後の最初の文字を大文字の変形に置き換えることです。私はググってドキュメントを読みましたが、XSLT でその単純な置換の解決策を見つけることができませんでした。

XSLT 2.0でそれが可能かどうか誰かが知っているでしょうか?

4

3 に答える 3

6

編集済み:元のポスターからの説明により、アンダースコアで区切られた最初の文字列の開始文字を大文字にしないでください。

このソリューションは再帰を使用しないため、非常に効率的です。

これが新しい解決策です:

string-join(
            (for  $i in 1 to count(tokenize(.,'_')),
                  $s in tokenize(.,'_')[$i],
                  $fl in substring($s,1,1),
                  $tail in substring($s,2)
               return
                  if($i eq 1)
                   then $s
                   else concat(upper-case($fl), $tail)
             ),
                        ''
           )

結果は、必要に応じて正確になります。

underLinedString

以下は古い解決策です。

replace()関数は、置換が固定されていることを前提としています。したがって、この問題を解決するための最良のツールではありません。

これがワンライナーXPath2.0ソリューションです(そしてそれは確かにXSLT 2.0変換の一部として使用できます:)):

string-join(
            (for $s in tokenize(.,'_'),
                 $fl in substring($s,1,1),
                 $tail in substring($s,2)
               return
                 concat(upper-case($fl), $tail)
             ),
            ''
           )

上記の式をXSLT2.0変換で次のように使用すると、次のようになります。

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/">
     <xsl:sequence select=
      "string-join(
                   (for $s in tokenize(.,'_'),
                    $fl in substring($s,1,1),
                    $tail in substring($s,2)
                  return
                concat(upper-case($fl), $tail)
                   ),
                   ''
                  )

      "/>
    </xsl:template>
</xsl:stylesheet>

そしてそれをこのXMLドキュメントに適用します:

<t>under_lined_String</t>

必要な結果が生成されます:

UnderLinedString
于 2009-01-28T21:09:43.020 に答える
1

テンプレートを使用してこれを行うことができ、文字列内の文字を反復処理するためにそれ自体を再帰的に呼び出します。このテンプレートは、1 から始まり、テンプレートへの呼び出しごとに増加する位置パラメータを取る必要があります。「_」が見つかった場合、translate(1.0) または upper-case(2.0) を使用して次の文字を大文字に変換します。

于 2009-01-28T20:47:07.903 に答える
0

すでに回答されていますが、ここに私の解決策があります:

<xsl:template name="camel-case">
  <xsl:param name='value'/>
  <xsl:analyze-string regex="^(.)" select="$value">
    <xsl:matching-substring><xsl:value-of select="upper-case(regex-group(1))"/></xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:analyze-string regex="[_-](.)" select=".">
        <xsl:matching-substring><xsl:value-of select="upper-case(regex-group(1))"/></xsl:matching-substring>
        <xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:non-matching-substring>          
  </xsl:analyze-string>
</xsl:template>

使用する:

<xsl:call-template name="camel-case">
  <xsl:with-param name='value' select="."/>
</xsl:call-template>
于 2011-08-01T03:53:36.877 に答える