2009-05-22 6 views
10

Il mio requisito è -utilizzare XSLT- per mostrare un elenco a discesa con gli Stati Uniti e stampare 'selezionato' su uno specifico che è dichiarato nell'XML che utilizzerà il mio foglio di stile.Come dichiarare e iterare una matrice in XSLT?

Stavo pensando di dichiarare un array con gli stati e iterarlo ma non so come farlo.

NOTA: Più idee sono benvenute;)

risposta

12

Un modo per farlo è quello di incorporare i dati relativi allo stato nel foglio di stile in sé, e accedere al documento foglio di stile utilizzando document(''), come segue:

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

fatemi sapere se avete domande.

+1

Non sarebbe anche possibile inserire il nodo my: states all'interno di una dichiarazione di variabile e utilizzare questa variabile nell'espressione select? –

+1

In XSLT 2.0, sì. In XSLT 1.0, dovresti utilizzare una funzione di estensione, come exsl: node-set() o msxsl: node-set(). Il documento ('') soluzione non richiede né. –

1

Idealmente si potrebbe memorizzare l'elenco degli stati nel file XML e basta usare XSLT per iterare loro.

Aggiornamento: Se non è possibile modificare il codice XML, si poteva guardare utilizzando il document function per caricare i dati da un secondo file di dati:

+0

Non riesco a modificare l'XML, è fornito da un altro sistema –

+0

È ancora possibile accedere a un altro documento XML statico contenente l'elenco degli stati utilizzando la funzione documento, giusto? – Elijah