I want to make my forms keep the smae value as submitted when there's an error. you can see the example i've created for option "3". I dont want to write this same chunk of code for every option on every select field. There must be a better way. Thoughts? Thanks SO'ers!

<select id="card-expires-month" name="fields[card-expires-month]">
    <option value="1" selected="selected">1 - January</option>
    <option value="2">2 - February</option>

    <xsl:element name="option">

        <xsl:attribute name="value">3</xsl:attribute>

        <xsl:if test="//data/events/deposit/post-values/card-expires-month = 3">
            <xsl:attribute name="selected">selected</xsl:attribute>
        </xsl:if>       

        <xsl:text>3 - March</xsl:text>

    </xsl:element>

    <option value="4">4 - April</option>
    <option value="5">5 - May</option>
    <option value="6">6 - June</option>
    <option value="7">7 - July</option>
    <option value="8">8 - August</option>
    <option value="9">9 - September</option>
    <option value="10">10 - October</option>
    <option value="11">11 - November</option>
    <option value="12">12 - December</option>
</select>
有帮助吗?

解决方案

With Wendell Piez method:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:variable name="vMonths">
            <xsl:text>1 - January|2 - February|3 - March|</xsl:text>
            <xsl:text>4 - April|5 - May|6 - June|</xsl:text>
            <xsl:text>7 - July|8 - August|9 - September|</xsl:text>
            <xsl:text>10 - October|11 - November|12 - December|</xsl:text>
        </xsl:variable>
        <select id="card-expires-month" name="fields[card-expires-month]">
            <xsl:for-each select="(//node())[12 >= position()]">
                <option value="{position()}">
                    <xsl:if test="//data
                                    /events
                                      /deposit
                                        /post-values
                                          /card-expires-month
                                  = position()">
                        <xsl:attribute name="selected">selected</xsl:attribute>
                    </xsl:if>
                    <xsl:value-of select="concat(
                                         position(),
                                         substring-before(
                                            substring-after(
                                               $vMonths,
                                               position()
                                            ),
                                            '|'
                                         )
                                      )"/>
                </option>
            </xsl:for-each>
        </select>
    </xsl:template>
</xsl:stylesheet>

Note: $vMonths declaration just thinking in readability

With plain recursion:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <select id="card-expires-month" name="fields[card-expires-month]">
            <xsl:call-template name="tokenize"/>
        </select>
    </xsl:template>
    <xsl:template name="tokenize">
        <xsl:param name="pString">
            <xsl:text>January|February|March|April|</xsl:text>
            <xsl:text>May|June|July|August|</xsl:text>
            <xsl:text>September|October|November|December</xsl:text>
        </xsl:param>
        <xsl:param name="pPosition" select="1"/>
        <xsl:choose>
            <xsl:when test="$pString=''"/>
            <xsl:when test="contains($pString,'|')">
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="pString"
                                    select="substring-before($pString,'|')"/>
                    <xsl:with-param name="pPosition" select="$pPosition"/>
                </xsl:call-template>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="pString"
                                    select="substring-after($pString,'|')"/>
                    <xsl:with-param name="pPosition" select="$pPosition + 1"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <option value="{$pPosition}">
                    <xsl:if test="//data
                                    /events
                                      /deposit
                                        /post-values
                                          /card-expires-month
                                  = $pPosition">
                        <xsl:attribute name="selected">selected</xsl:attribute>
                    </xsl:if>
                    <xsl:value-of select="concat($pPosition,' - ',$pString)"/>
                </option>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Both output:

<select id="card-expires-month" name="fields[card-expires-month]">
    <option value="1">1 - January</option>
    <option value="2">2 - February</option>
    <option value="3">3 - March</option>
    <option value="4">4 - April</option>
    <option value="5">5 - May</option>
    <option value="6">6 - June</option>
    <option value="7">7 - July</option>
    <option value="8">8 - August</option>
    <option value="9">9 - September</option>
    <option value="10">10 - October</option>
    <option value="11">11 - November</option>
    <option value="12">12 - December</option>
</select>

EDIT: As for @Flack's comment, the clasic answer with inline or external source:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:m="month"
 exclude-result-prefixes="m">
    <xsl:output method="html"/>
    <m:m>January</m:m>
    <m:m>February</m:m>
    <m:m>March</m:m>
    <m:m>April</m:m>
    <m:m>May</m:m>
    <m:m>June</m:m>
    <m:m>July</m:m>
    <m:m>August</m:m>
    <m:m>September</m:m>
    <m:m>October</m:m>
    <m:m>November</m:m>
    <m:m>December</m:m>
    <xsl:template match="/">
        <xsl:variable name="vSelected"
         select="//data/events/deposit/post-values/card-expires-month"/>
        <select id="card-expires-month" name="fields[card-expires-month]">
            <xsl:for-each select="document('')/*/m:m">
                <option value="{position()}">
                    <xsl:if test="$vSelected = position()">
                        <xsl:attribute name="selected">selected</xsl:attribute>
                    </xsl:if>
                    <xsl:value-of select="concat(position(),' - ',.)"/>
                </option>
            </xsl:for-each>
        </select>
    </xsl:template>
</xsl:stylesheet>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top