2010-07-14 27 views
6

Ist eine Variable, die eine Liste unterschiedlicher Zustände mit der Funktion distinct-values ​​() zurückgibt, eine Möglichkeit, die Variable in einer for-each-Schleife zu tokenisieren?Schleifen über verschiedene Werte

Die folgende Variable gibt AL und NM zurück, aber ich kann nicht mit for-each darüber iterieren. Gibt es einen Weg dahin?

<xsl:variable name="FormStates" select="distinct-values(States/State)"/> 
    <xsl:for-each select="$FormStates"> 

XSLT 2.0 ok.

+0

Wie immer ist es das, was Problem, das Sie haben nicht klar. Erfahren Sie, wie Sie Folgendes bereitstellen: 1. Das Quell-XML-Dokument. 2. Das gewünschte Ergebnis. 3. Die erforderlichen Eigenschaften der Transformation. –

+0

Ich habe diese Frage SCHLIESSEN gewählt. Es ist nicht wirklich eine Frage - keine Frage wird gestellt. Das Problem ist nicht definiert und nicht klar. –

+0

Sorry, ich habe die Frage hoffentlich geklärt. – johkar

Antwort

5

Die Funktion distinct-values() gibt eine Sequenz von Werten zurück, die Sie durchlaufen können. Das Ergebnis wird sozusagen "tokenisiert".

fn:distinct-values('AL', 'AL', 'NL') gibt die Sequenz ('AL', 'NL') zurück.

Wenn Sie die Variable mit xsl:value-of ausgeben, wird nur die Zeichenfolge "AL NL" zurückgegeben, da das Standardsequenztrennzeichen für xsl:value-of ein einzelnes Leerzeichen ist. Dies ist etwas, das man mit dem @separator Attribut ändern könnte:

Eingang

<?xml version="1.0" encoding="UTF-8"?> 
<States> 
    <State>AL</State> 
    <State>AL</State> 
    <State>NM</State> 
</States> 

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/"> 
    <xsl:variable name="FormStates" select="distinct-values(States/State)"/> 
    <xsl:comment>xsl:value-of</xsl:comment> 
    <xsl:value-of select="$FormStates" separator=":"/> 
    <xsl:comment>xsl:for-each</xsl:comment> 
    <xsl:for-each select="$FormStates"> 
     <xsl:value-of select="."/> 
     <xsl:text>:</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Ausgabe

<?xml version="1.0" encoding="UTF-8"?> 
<!--xsl:value-of--> 
AL:NM 
<!--xsl:for-each--> 
AL:NM: 
+0

Danke. Das Trennzeichenattribut war mir nicht bekannt. Ich habe am Ende eine Zeichenfolge mit Trennzeichen erstellt und tokenize() verwendet, aber ich werde zurückgehen und es bereinigen. – johkar

0

In der Theorie sollte es funktionieren; Sind Sie sicher, dass der der distinct-values-Funktion zugewiesene XPath korrekt ist? Der von Ihnen angegebene Code erfordert, dass das Element States ein Geschwisterelement des Elements forms ist.

Sie könnten sofort nach der Variablendeklaration <xsl:value-of select="count($FormStates)"> einfügen, um zu bestätigen, dass es richtig eingestellt ist.

2

Hier ist eine XSLT 1.0 Lösung, die ich in der Vergangenheit verwendet habe.

<xsl:template match="/">   
    <ul> 
     <xsl:for-each select="//State[not(.=preceding::*)]"> 
     <li> 
      <xsl:value-of select="."/> 
     </li> 
     </xsl:for-each>    
    </ul> 
    </xsl:template> 

Returns:

<ul xmlns="http://www.w3.org/1999/xhtml"> 
    <li>AL</li> 
    <li>NM</li> 
</ul>