2013-08-20 2 views
1

У меня есть код, как показано ниже, который дает ошибку компиляции стилей.XSL: Выберите запрос

<xsl:template match="form"> 
     <xsl:copy> 
      <xsl:for-each select="@*"> 
       <xsl:variable name="param" select="name(.)" /> 
       <xsl:choose> 
        <xsl:when test="$param = 'name'"> 
         <xsl:attribute name="name"><xsl:value-of 
          select="@name" /></xsl:attribute> 
        </xsl:when> 
        <xsl:when test="$param = 'action'"> 
         <xsl:attribute name="action"><xsl:value-of 
          select="java:com.hp.cpp.proxy.util.URLUtils.rewriteAction($response, $baseurl, @action, $scope)" /></xsl:attribute> 
        </xsl:when> 
        <xsl:when test="$param = 'method'"> 
         <xsl:attribute name="method">POST</xsl:attribute> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:attribute name="$param"><xsl:value-of 
          select="." /></xsl:attribute> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
      <input type="hidden" name="httpmethod"> 
       <xsl:attribute name="value"> <xsl:value-of 
        select="@method" /></xsl:attribute> 
      </input> 
      <xsl:apply-templates select="node()|@*" /> 

     </xsl:copy> 
    </xsl:template> 

Я пытаюсь переписать тег FORM HTML с довольно сложными требованиями. Надеюсь, вы сможете идентифицировать с помощью кодовой привязки. Я пытаюсь переписать только несколько атрибутов тега и попытаться сохранить остальные. Правильно ли это? Любой другой способ сделать это? Любое предложение.

Заранее спасибо.

-Rikin

+1

Вы говорите, что вы получите ошибку компиляции, но не один, который. Также вы отмечаете свой вопрос как с 1.0, так и с 2.0, и что это такое? Можете ли вы обновить свой вопрос с минимальным полным примером (включая таблицу xsl: stylesheet и объявленные пространства имен)? Я предполагаю, что метод расширения 'rewriteAction' не объявлен или вообще отсутствует. – Abel

ответ

0

Просто догадаться. Попробуйте заменить последний применить

<xsl:apply-templates select="node()|@*" /> 

этим

<xsl:apply-templates select="node()" /> 
0

об ошибке компиляции, не дают достаточно информации, чтобы помочь; Догадка Абеля о том, что ошибка компиляции связана с вашим вызовом функции расширения, правдоподобна.

Вы также спрашиваете Правильно ли это? для достижения вашей цели. Может быть. Ваша первая проблема здесь - логическая ошибка, о которой уже указал jvverde. Призыв к применению шаблонов не должен выбирать атрибуты; вы уже рассмотрели все атрибуты. Поэтому нет необходимости обрабатывать их снова. Это также плохая идея: если вы снова попытаетесь обработать атрибуты элемента form, вы получите ошибку во время выполнения, потому что вы уже написали контент для элемента (а именно, что элемент input).

Я думаю, что некоторые XSLT программисты пишут то, что выглядит примерно так:

<xsl:template match="form"> 
    <xsl:copy> 

    <!--* don't use a for-each to handle the 
     * attributes; use templates. *--> 
    <xsl:apply-templates select="@*"/> 

    <!--* you don't need an xsl:attribute constructor 
     * if you want to use an expression within a 
     * literal result element; just braces in the 
     * attribute-value template. 
     *--> 
    <input type="hidden" 
      name="httpmethod" 
      value="{@method}" /> 

    <!--* change your apply-templates call to 
     * select children, but not attributes. 
     *--> 
    <xsl:apply-templates select="node()" /> 
    </xsl:copy> 
</xsl:template> 

<!--* now the attributes ... *--> 
<xsl:template match="form/@action"> 
    <xsl:attribute name="action"> 
    <xsl:value-of select="java:com.hp.cpp.proxy.util.URLUtils.rewriteAction(
          $response, $baseurl, @action, $scope)" /> 
    </xsl:attribute> 
</xsl:template> 
<xsl:template match="form/@method"> 
    <xsl:attribute name="method"> 
    <xsl:value-of select="'POST'"/> 
    </xsl:attribute> 
</xsl:template>