2009-05-22 10 views
10

私の要件は、XSLT-を使用して、アメリカの州とのドロップダウンリストを表示し、印刷は、自分のスタイルシートを使用するXMLで宣言されている特定のものを '選択'しています。XSLTで配列を宣言して反復するには?

私は状態の配列を宣言し、それを繰り返すことを考えていましたが、それを行う方法はわかりません。

注:その他のアイデアは歓迎されている;)

答えて

12

一つの方法は、スタイルシートの中に状態データを埋め込むことです自分自身、そして次のように、document('')を使用して、スタイルシートのドキュメントにアクセス:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="whatever" 
    exclude-result-prefixes="my"> 

    <xsl:output indent="yes"/> 

    <!-- The value of the state you want to select, supplied in the input XML --> 
    <xsl:variable name="selected-state" select="/xpath/to/state/value"/> 

    <!-- You have to use a namespace, or the XSLT processor will complain --> 
    <my:states> 
    <option>Alabama</option> 
    <option>Alaska</option> 
    <!-- ... --> 
    <option>Wisconsin</option> 
    <option>Wyoming</option> 
    </my:states> 

    <xsl:template match="/"> 
    <!-- rest of HTML --> 
    <select name="state"> 
     <!-- Access the embedded document as an internal "config" file --> 
     <xsl:apply-templates select="document('')/*/my:states/option"/> 
    </select> 
    <!-- rest of HTML --> 
    </xsl:template> 

      <!-- Copy each option --> 
      <xsl:template match="option"> 
      <xsl:copy> 
       <!-- Add selected="selected" if this is the one --> 
       <xsl:if test=". = $selected-state"> 
       <xsl:attribute name="selected">selected</xsl:attribute> 
       </xsl:if> 
       <xsl:value-of select="."/> 
      </xsl:copy> 
      </xsl:template> 

</xsl:stylesheet> 

は、ご質問があれば私に教えてください。

+1

my:statesノードを変数宣言内に配置して、この変数をselect式で使用することもできませんか? –

+1

XSLT 2.0では、はい。 XSLT 1.0では、exsl:node-set()やmsxsl:node-set()などの拡張関数を使用する必要があります。ドキュメント( '')ソリューションにはどちらも必要ありません。 –

1

理想的にあなたのXMLファイル内の状態のリストを格納し、ちょうどそれらを反復処理するためにXSLTを使用します。

更新: あなたはXMLを編集することができない場合は、第二のデータファイルからデータをロードするためにdocument functionを使用して見て可能性:これを行うには

+0

私はXMLを変更できません。別のシステムによって提供されています –

+0

あなたはまだドキュメント関数を使用して状態リストを含む別の静的XMLドキュメントにアクセスできますか? – Elijah

関連する問題