2017-03-28 3 views
0

私は月の対応する数字の月の名前を変換するルックアップテーブルを作成しました。XSLT、数値ループを持つルックアップテーブルのkey()関数の代替方法

それはいくつかのようだ:I

<li class="active">3</li> 

しかし、この(およびすべてで)場合:

に変身
<Months> 
    <Month>March</Month> 

:それはのようなデータから始めて、作品

<lookup:months> 
    <lookup:month><lookup:nr>1</lookup:nr> <lookup:name>January</lookup:name></lookup:month> 
    <lookup:month><lookup:nr>2</lookup:nr> <lookup:name>February</lookup:name></lookup:month> 
    <lookup:month><lookup:nr>3</lookup:nr> <lookup:name>March</lookup:name></lookup:month> 

次のような最終的なマークアップを取得したいと考えています:

<li>1</li> 
<li>2</li> 
<li class="active">3</li> 
<li>3</li> 
<li>4</li> 
<li>5</li> 
<li>6</li> 
<li>7</li> 
<li>8</li> 
<li>9</li> 
<li>10</li> 
<li>11</li> 
<li>12</li> 

どうすればこの結果が得られますか?

+0

あなたは(12'示唆に '1として)XSLT 2.0を使用していますか? –

答えて

0

@Martin Honnenからの回答は確かに最も洗練されたものですが、他のパラメータにも拡張できるkey()のルックアップテーブルシステムを使用したい場合、この解決策を見つけることができました:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output indent="yes"/> 

<!-- lookup table --> 
<xsl:variable name="months-lookup-table"> 
    <month><nr>1</nr> <name>January</name></month> 
    <month><nr>2</nr> <name>February</name></month> 
    <month><nr>3</nr> <name>March</name></month> 
    <month><nr>4</nr> <name>April</name></month> 
    <month><nr>5</nr> <name>May</name></month> 
    <month><nr>6</nr> <name>June</name></month> 
    <month><nr>7</nr> <name>July</name></month> 
    <month><nr>8</nr> <name>August</name></month> 
    <month><nr>9</nr> <name>September</name></month> 
    <month><nr>10</nr> <name>October</name></month> 
    <month><nr>11</nr> <name>November</name></month> 
    <month><nr>12</nr> <name>December</name></month> 
</xsl:variable> 

    <!-- key to convert name month (in month number) --> 
    <xsl:key name="from-name-of-month-to-nr-of-month" match="month" use="name"/> 



    <xsl:template match="Months"> 


     <!-- save the selected month context --> 
     <xsl:variable name="selected-month" select="Month"/> 

     <!-- loop all months name in the lookup table, THIS is the active loop --> 
     <xsl:for-each select="$months-lookup-table/month"> 

      <!-- print the current looped month transformed from name to number, if the current looped month ($month-in-loop) name matches with the month name in XML source ($selected-month), add an attribute of "active" --> 
       <xsl:element name="li"> 
        <xsl:if test="$selected-month = name"> 
         <xsl:attribute name="class">active</xsl:attribute> 
        </xsl:if> 
        <xsl:value-of select="key('from-name-of-month-to-nr-of-month', name, $months-lookup-table)/nr"/> 
       </xsl:element> 

     </xsl:for-each>   


    </xsl:template> 

http://xsltransform.net/3NSSEwa/2

1

あなただけの入力で1ヶ月の価値を持っている場合...

<xsl:for-each select="1 to 12"> 
    [pseudo code] when key match, value of "key(args)/lookup:nr" 
    otherwise value-of select="." 

私が試したが、私はそれを動作させることはできません。

は、私はのようなものを使用しているとししかし、XSLT 2.0と仮定すると、すべての月の番号のリストを生成したい、それを使用することで十分

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:param name="months" 
    select="'January', 'February', 'March', 'April', 'May', 'June', 
    'July', 'August', 'September', 'October', 'November', 'December'"/> 

<xsl:output indent="yes"/> 

<xsl:template match="Months"> 
    <xsl:variable name="month" select="Month"/> 
    <xsl:for-each select="1 to 12"> 
     <li> 
      <xsl:if test="$months[current()] = $month"> 
       <xsl:attribute name="class">active</xsl:attribute> 
      </xsl:if> 
      <xsl:value-of select="."/> 
     </li> 
    </xsl:for-each> 
</xsl:template> 

</xsl:transform> 

http://xsltransform.net/jz1PuQm

関連する問題