XSL 1.0 - Динамический выбор набора переменных в шаблоне вызова

Итак, я преобразовываю XML-канал в HTML и при этом даю конечному пользователю возможность выбрать 1 из 3 цветовых схем. В зависимости от выбранной цветовой схемы я пытаюсь присвоить значения параметрам в команде шаблона вызова, которая будет отображать XML.

Я новичок в XSL, поэтому не стесняйтесь указывать мне лучшую методологию.

Вот пример моего кода:

<xsl:template match="/">

<xsl:variable name="basic_head_title_color">#414141</xsl:variable>
<xsl:variable name="basic_head_title_size">18px</xsl:variable>
<xsl:variable name="basic_head_desc_color">#8b8b8b</xsl:variable>

<xsl:variable name="contrast_head_title_color">#ffffff</xsl:variable>
<xsl:variable name="contrast_head_title_size">18px</xsl:variable>
<xsl:variable name="contrast_head_desc_color">#e1e1e1</xsl:variable>

<xsl:variable name="black_head_title_color">#ffffff</xsl:variable>
<xsl:variable name="black_head_title_size">18px</xsl:variable>
<xsl:variable name="black_head_desc_color">#e1e1e1</xsl:variable>

<xsl:when test="$display_theme = 'basic'" >
    <xsl:variable name ="chosen_head_title_color" select="basic_head_title_color"/>  
    <xsl:variable name ="chosen_head_title_size" select="basic_head_title_size"/>          
    <xsl:variable name ="chosen_head_desc_color" select="basic_head_desc_color"/>                  
</xsl:when>

<xsl:when test="$display_theme = 'contrast'" >
    <xsl:variable name ="chosen_head_title_color" select="contrast_head_title_color"/>  
    <xsl:variable name ="chosen_head_title_size" select="contrast_head_title_size"/>          
    <xsl:variable name ="chosen_head_desc_color" select="contrast_head_desc_color"/>
</xsl:when>

<xsl:when test="$display_theme = 'black'" >
     <xsl:variable name ="chosen_head_title_color" select="black_head_title_color"/>  
    <xsl:variable name ="chosen_head_title_size" select="black_head_title_size"/>          
    <xsl:variable name ="chosen_head_desc_color" select="black_head_desc_color"/>  
</xsl:when>


    <xsl:call-template name="render_xml">
            <xsl:with-param name="head_title_color" select="chosen_head_title_color" />
            <xsl:with-param name="head_title_size" select="chosen_head_title_size" />
            <xsl:with-param name="head_desc_color" select="chosen_head_desc_color" />
    </xsl:call-template>

</template>

person DigitalMC    schedule 22.01.2013    source источник


Ответы (1)


Ваш XSLT недействителен в нескольких местах, но как это?

  <xsl:param name="display_theme" select="'basic'" />

  <v:styles xmlns:v="transform-variables">
    <style name="basic" titleColor="#41414" titleSize="18px" descColor="#8b8b8b" />
    <style name="contrast" titleColor="#ffffff" titleSize="18px" descColor="#e1e1e1" />
    <style name="black" titleColor="#ffffff" titleSize="18px" descColor="#e1e1e1" />
  </v:styles>

  <xsl:template match="/">

    <xsl:variable name="style" select="document('')//style[@name = $display_theme]" />

    <xsl:call-template name="render_xml">
      <xsl:with-param name="head_title_color" select="$style/@titleColor" />
      <xsl:with-param name="head_title_size" select="$style/@titleSize" />
      <xsl:with-param name="head_desc_color" select="$style/@descColor" />
    </xsl:call-template>

  </xsl:template>
person JLRishe    schedule 22.01.2013
comment
Это выглядит гениально, я попытаюсь получить этот функционал сегодня днем ​​и дам вам знать, если он работает. Спасибо за быстрый ответ! - person DigitalMC; 22.01.2013
comment
Это сработало! Уменьшил мой код с 936 строк до 268... Хорошо поиграл, друг мой. - person DigitalMC; 23.01.2013