2009-05-22 9 views
10

Meine Anforderung ist - mit XSLT - eine Dropdown-Liste mit den US-Bundesstaaten zu zeigen und Drucken 'ausgewählt' auf eine bestimmte, die in der XML deklariert ist, die mein Stylesheet verwenden wird.Wie deklariere und wiederhole ich ein Array in XSLT?

Ich dachte über ein Array mit den Zuständen erklären und es iterieren, aber ich weiß nicht, wie es geht.

HINWEIS: Weitere Ideen sind willkommen;)

Antwort

12

Eine Möglichkeit, dies zu tun, ist die Zustandsdaten in das Stylesheet einbinden selbst, und Zugriff auf das Stylesheet-Dokument mit document('') wie folgt:

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

Lassen Sie mich wissen, wenn Sie Fragen haben.

+1

Wäre es nicht auch möglich, den my: states-Knoten in eine Variablendeklaration zu setzen und diese Variable im select-Ausdruck zu verwenden? –

+1

In XSLT 2.0, ja. In XSLT 1.0 müssen Sie eine Erweiterungsfunktion verwenden, z. B. exsl: node-set() oder msxsl: node-set(). Die Dokumentenlösung ('') erfordert keine. –

1

Idealerweise würde speichern Sie die Liste der Staaten in der XML-Datei und nur XSLT ihnen zu wechseln.

Update: Wenn Sie die XML nicht bearbeiten können, können Sie bei Verwendung der document function aussehen könnten Daten von einer zweiten Datendatei zu laden:

+0

Ich kann das XML nicht ändern, es wird von einem anderen System zur Verfügung gestellt –

+0

Sie können weiterhin auf ein anderes statisches XML-Dokument zugreifen, das die Statusliste enthält, indem Sie die Dokumentfunktion verwenden, richtig? – Elijah

Verwandte Themen