xslt это нормально, если мы сделаем `select =" $ position + $ jump "`? - PullRequest
1 голос
/ 09 июня 2011

У меня есть этот код (который работает правильно):

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

И я попытался нормализовать его abit как таковой:

   <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:variable name="jump" select="2"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="substring($input, $position, 1)"/>
               <xsl:variable name="jump" select="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>

Но после того, как я "нормализовал" это ... он больше не работает. Я подозреваю, что это как-то связано с частью select="$position + $jump", но я не уверен, что с ней не так. кто-нибудь знает в чем дело?

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Ваша проблема в том, что переменная $jump находится вне области видимости.Вы не можете устанавливать переменные внутри xsl:choose и ожидать, что их значение сохранится снаружи.Я считаю, что вы должны отредактировать среднюю часть следующим образом:

<xsl:variable name="char" select="substring($input, $position, 1)" />

<xsl:variable name="jump">
    <xsl:choose>
        <xsl:when test="$char = '_'">2</xsl:when>
        <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<xsl:choose>
    <xsl:when test="$char = '_'">
        <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$char"/>
    </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:choose должно идти в пределах xsl:variable, а не наоборот.

Если честно,Я не вижу ничего нежелательного с вашим исходным кодом.Это выглядит чище для меня.

1 голос
/ 09 июня 2011

Каждая из двух $jump переменных выходит из области видимости, прежде чем ссылаться на них .

В XSLT, как и в любом блочно-структурированном языке, переменная имеет область видимости, из которой она не определена.

    <xsl:when test="substring($input, $position, 1) = '_'">
        <xsl:value-of select=
        "translate(substring($input, $position + 1, 1),
                   'abcdefghijklmnopqrstuvwxyz',
                   'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
        <xsl:variable name="jump" select="2"/>
    </xsl:when>

здесь вы определяете переменную $jump в самом конце ее области видимости, и она немедленно перестает существовать. Это очевидная ошибка, и некоторые процессоры XSLT, такие как Saxon, даже выдают предупреждающее сообщение об этом.

У вас точно такая же проблема с определением другой переменной (также называемой $jump).

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