3

このコードを書くためのより良い方法は何ですか:

 <xsl:template name="CamelChain">
      <xsl:param name="input"/>
      <xsl:param name="position"/>
      <xsl:if test="$position &lt;= string-length($input)">
         <xsl:choose>
         <xsl:when test="substring($input, $position, 1) = '_'">
            <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>

            <xsl:call-template name="CamelChain">
               <xsl:with-param name="input" select="$input"/>
               <xsl:with-param name="position" select="$position + 2"/>
            </xsl:call-template>
         </xsl:when>

         <xsl:otherwise>

            <xsl:value-of select="substring($input, $position, 1)"/>

            <xsl:call-template name="CamelChain">
               <xsl:with-param name="input" select="$input"/>
               <xsl:with-param name="position" select="$position + 1"/>
            </xsl:call-template>
         </xsl:otherwise>
         </xsl:choose>
      </xsl:if>
   </xsl:template>

きれいですが、もっときれいにできると思います。今、私はこのロジックを繰り返しているとしましょう:

<xsl:call-template name="CamelChain">
               <xsl:with-param name="input" select="$input"/>
               <xsl:with-param name="position" select="$new_position"/>
            </xsl:call-template>

だから基本的に誰かが何か解決策を持っていますか?

私は実際に自分で試してみました @ xslt `select="$position + $jump"` を実行しても問題ありませんか? しかし、その方法(または私が呼ぶようにハック)は機能していません..だから私は現在解決策がなく、誰かが助けてくれるかどうか疑問に思っていました.

基本的に私は次のように考えていました:

<xsl:template name="CamelChain">
      <xsl:param name="input"/>
      <xsl:param name="position"/>
      <xsl:variable name="jump"/>
      <xsl:if test="$position &lt;= string-length($input)">
         <xsl:choose>
            <xsl:when test="substring($input, $position, 1) = '_'">
               <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
               <!-- set jump to 2 -->
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="substring($input, $position, 1)"/>
               <!-- set jump to 1 -->
            </xsl:otherwise>
         </xsl:choose>
         <xsl:call-template name="CamelChain">
            <xsl:with-param name="input" select="$input"/>
            <xsl:with-param name="position" select="$position + $jump"/>
         </xsl:call-template>
      </xsl:if>
   </xsl:template>

または、まったく異なる、またはエキゾチックなものかもしれません。(ここでは拡張なしの XSLT 1.0)

4

2 に答える 2

3

より良い方法は、XSLT2.0でそれを書くことです。

<xsl:analyze-string select="$in" regex="_.">
  <xsl:matching-substring>
    <xsl:value-of select="uppercase(substring(., 2, 1))"/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
     <xsl:value-of select="value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

XSLT 1.0で文字操作の問題を解決するのは、退屈で冗長になるでしょう。

于 2011-06-09T20:03:04.157 に答える
1

@Michael-Key が明確に述べているように、XSLT 1.0 での文字列操作は冗長です (まあ、面倒です..依存します:)。

私はあなたのテンプレートを見てきましたが、テンプレートの設計方法について考えを変えない限り、テンプレートのスコープ内でテンプレートの再帰呼び出しを一度だけ取得するのはそれほど簡単ではないと思います。

テンプレートが入力単語の最初の文字を大文字にしないことにも注意してください。それは望んでいますか?

ただし、さらに退屈で冗長になるリスクがあるため、このアプローチを示したいと思います。

  • 1 つのパラメータのみが使用されます
  • 最初の文字の問題が修正されました
  • 変数の使用 (変数がどのように機能するかを確認できるようにするため)
  • テンプレートは_、あなたのように各文字に対して1回ではなく、各文字に対して1回呼び出されます(明らかにそうではありませんか?)

<xsl:template name="CamelCase">

    <xsl:param name="input" select="'this_string_will_be_camel_case'"/>

    <xsl:variable name="camel">
        <xsl:variable name="sub" select="substring-before($input,'_')"/> 
        <xsl:choose>
            <xsl:when test="not(string-length($sub)=0)">
                <xsl:value-of select="$sub"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$input"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

    <xsl:variable name="case">
        <xsl:value-of select="translate(
            substring($camel,1,1),
            'abcdefghijklmnopqrstuvwxyz',
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
    </xsl:variable>

    <xsl:value-of select="concat($case,substring($camel,2))"/>

    <xsl:if test="not(string-length($camel)=0)">
        <xsl:call-template name="CamelCase">
            <xsl:with-param name="input" select="substring-after($input,'_')"/>
        </xsl:call-template>
    </xsl:if>

</xsl:template>

たとえば、次のように呼び出すとします。

 <xsl:call-template name="CamelCase"/>

それは戻ります:

 ThisStringWillBeCamelCase
于 2011-06-09T23:25:15.620 に答える