زسلت:تمرير متغير في قالب عند استخدام تطبيق قوالب

StackOverflow https://stackoverflow.com//questions/25037792

  •  21-12-2019
  •  | 
  •  

سؤال

لست متأكدا مما إذا كان هذا يسأل الكثير من زسلت ، ولكن أنا بعد شيء مماثل لكيفية mode يعمل ، باستثناء مثالي داخل قالب واحد ، بدلا من الاضطرار إلى تكراره كما أنا الآن:

<!-- Start -->
<xsl:apply-templates select="airports/airport" mode="start" />

<!-- End -->
<xsl:apply-templates select="airports/airport" mode="end" />

<!-- Template -->
<xsl:template match="airports/airport" mode="start">
    <option value="{@iata}" data-alternative-spellings="{.},{@iata}">
        <xsl:if test="@iata = 'LGW'">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@iata"/> - <xsl:value-of select="."/>
    </option>
</xsl:template>
<xsl:template match="airports/airport" mode="end">
    <option value="{@iata}" data-alternative-spellings="{.},{@iata}">
        <xsl:if test="@iata = 'LAX'">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@iata"/> - <xsl:value-of select="."/>
    </option>
</xsl:template>

القالب ينطبق على selected السمة إذا كانت القيمة شيء محدد.يجب أن تكون هذه القيمة مختلفة اعتمادا على ما يسمى القالب.هناك حالتان, start و end أن كلاهما له معايير مختلفة.

أسهل طريقة لشرح ما أحاول القيام به هو بالنسبة لي لكتابة ذلك بلغة أخرى :)

<!-- Start -->
getAirports(start);

<!-- End -->
getAirports(end);

<!-- Template -->
var getAirports = function(position)
{
    var selected = '';
    switch(position)
    {
        case 'start':
            if(iata == 'LGW')
            {
                var selected = 'selected="selected"';
            }
        break;
        case 'end':
            if(iata == 'LAX')
            {
                var selected = 'selected="selected"';
            }
        break;
        default:
        break;
    }
    return '<option value="'+iata+'" data-alternative-spellings="'+iata+','+name+'" '+selected+'>'+iata+' - '+name+'</option>';
}

هل هذا ممكن في زسلت ، أو سوف تضطر إلى التمسك تكرار القالب واستخدام mode?

شكراً!

هل كانت مفيدة؟

المحلول

أعطاني مستخدم تويتر زميل لي الحل ، والتي يمكن العثور عليها في هذا جوهر.

ما احتاجه هو with-param, ، شيء لم أستخدمه من قبل:

<!-- Start -->
<xsl:apply-templates select="airports/airport">
    <xsl:with-param name="position" select="'start'" />
</xsl:apply-templates>

<!-- End -->
<xsl:apply-templates select="airports/airport">
    <xsl:with-param name="position" select="'end'" />
</xsl:apply-templates>

<xsl:template match="airports/airport">
    <xsl:param name="position" />
    <option value="{@iata}" data-alternative-spellings="{.},{@iata}">
        <xsl:if test="(@iata = 'LGW' and $position = 'start') or (@iata = 'LAX' and $position = 'end')">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>
        <xsl:value-of select="@iata"/> - <xsl:value-of select="." />
    </option>
</xsl:template>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top