xslt
  • param
  • apply-templates
  • 2009-10-21 1 views 2 likes 
    2

    Я хотел бы применить шаблон с различными параметрами на основе результата условного. Что-то вроде этого:XSLT: применять шаблоны с условными параметрами?

    <xsl:choose> 
        <xsl:when test="@attribute1"> 
         <xsl:apply-templates select='.' mode='custom_template'> 
          <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 1</xsl:with-param> 
          <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param> 
         </xsl:apply-templates> 
        </xsl:when> 
        <xsl:when test="@attribute2"> 
         <xsl:apply-templates select='.' mode='custom_template'> 
          <xsl:with-param name="attribute_name" tunnel="yes">Attribute no. 2</xsl:with-param> 
          <xsl:with-param name="attribute_value" tunnel="yes"><xsl:value-of select="@attribute1"/></xsl:with-param> 
         </xsl:apply-templates> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select='.' mode='custom_template'> 
          <xsl:with-param name="attribute_name" tunnel="yes">Error</xsl:with-param> 
          <xsl:with-param name="attribute_value" tunnel="yes">No matching attribute </xsl:with-param> 
          </xsl:apply-templates> 
        </xsl:otherwise> 
    </xsl:choose> 
    

    Прежде всего, я подозреваю, что это можно решить гораздо лучше. (Я совершенно новичок в XSLT, поэтому, пожалуйста, предложите улучшения и простите раздутый код.)

    Теперь на вопрос: как я мог установить параметры на основе этого условного и все еще использовал их в xsl:apply-templates? Я попытался обернуть весь xsl:choose стартовым/конечным тегом xsl:apply-templates, но это, по-видимому, не является законным. Любые подсказки?

    ответ

    9

    Альтернативный метод должен был бы поставить XSL: выбрать заявления в пределах XSL: Param элементы

    <xsl:apply-templates select="." mode="custom_template"> 
        <xsl:with-param name="attribute_name" tunnel="yes"> 
         <xsl:choose> 
         <xsl:when test="@attribute1">Attribute no. 1</xsl:when> 
         <xsl:when test="@attribute2">Attribute no. 2</xsl:when> 
         <xsl:otherwise>Error</xsl:otherwise> 
         </xsl:choose> 
        </xsl:with-param> 
        <xsl:with-param name="attribute_value" tunnel="yes"> 
         <xsl:choose> 
         <xsl:when test="@attribute1"><xsl:value-of select="@attribute1"/></xsl:when> 
         <xsl:when test="@attribute2"><xsl:value-of select="@attribute1"/></xsl:when> 
         <xsl:otherwise>No matching attribute </xsl:otherwise> 
         </xsl:choose> 
        </xsl:with-param> 
    </xsl:apply-templates> 
    
    +0

    +1. Побей меня. ;-) – Tomalak

    +0

    Спасибо, Тим C! Это кажется лучше. – conciliator

    3

    Нет ничего плохого в вашем методе, но вы также можете добавить свое условное обозначение в атрибут xsl:template match. Это приведет только один xsl:apply-templates, но несколько xsl:template элементов

    +0

    Благодаря Rubens, однако я не совсем уверен, что вы стремясь ... Я все еще слишком неопытен, чтобы следовать за вами без каких-либо конкретных примеров. – conciliator

    3

    Вы можете избавиться от всей этой логики и режимы путем извлечения ваших условий в предикаты. Вы не говорите, что название элемента, который вы имеете дело с есть, но предполагая, что это называется foo то что-то вроде этого должно хватить:

    <xsl:template match="foo[@attribute1]"> 
        <!-- 
         do stuff for the case when attribute1 is present 
         (and does not evaluate to false) 
        --> 
    </xsl:template> 
    
    <xsl:template match="foo[@attribute2]"> 
        <!-- 
         do stuff for the case when attribute2 is present 
         (and does not evaluate to false) 
        --> 
    </xsl:template> 
    
    <xsl:template match="foo"> 
        <!-- 
         do stuff for the general case 
         (when neither attribute1 nor attribute 2 are present) 
        --> 
    </xsl:template> 
    

     Смежные вопросы

    • Нет связанных вопросов^_^