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"` 可以吗?但是这种方法(或我称之为 hack)不起作用..所以我目前没有解决方案,想知道是否有人可以提供帮助。

基本上我的想法是:

<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

更好的方法是在 XSLT 2.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 中的字符串操作是冗长的(嗯,乏味..depends :)。

我已经查看了您的模板,我认为仅在模板范围内进行模板递归调用就不容易获得,除非您改变主意如何设计模板。

另请注意,您的模板不会将输入单词的第一个字母大写这是想要的吗?

但是,有可能会更加乏味和冗长,我想向您展示这种方法:

  • 只使用了一个参数
  • 第一个字符的问题已修复
  • 变量的使用(这样你就可以看到它们是如何工作的)
  • 模板为每个角色调用一次,_而不是像您那样为每个角色调用一次(显然不是?)

<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 回答