2011-03-20 15 views
1

エラーが発生したときにフォームに提出されたsmae値を保持したい。私はオプション "3"のために作成した例を見ることができます。私はすべての選択フィールドのすべてのオプションのコードのこの同じチャンクを記述したくない。より良い方法が必要です。思考?ありがとうございました!選択フィールドのスティッキーフォーム

ウェンデルPiez方法で
<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> 
+1

あなたは、あなたが使用するソリューションについて説明し、質問にアップデートとして、それを追加したい場合は、誰かの答えにではありません。 – cHao

+0

私はそれが間違った方法かもしれないと思っていましたが、それが修正され、注目されると仮定しました。thnx cHao –

答えて

3

<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> 

$vMonths宣言ちょうど明白な再帰で可読性

に思考:

<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> 

両出力:

<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:フラックさんのコメント@については、インラインまたは外部ソースとのclasic答え:

<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> 
+0

ありがとう!私はそれを一般的な目的のために抽象化した。これは素晴らしい! –

+0

@Kirk Strobeck。どういたしまして。 –

+0

+1は良い答えです。私は数ヶ月間、トークン化可能な文字列ではなく、独自の名前空間にノードセットを保持します。 – Flack

関連する問題