Come faccio a generare un elenco separato da virgola con XSLT / XPath?

Dati questi dati XML:

 
    mela 
    arancione 
    banane 
 

Posso usare questo markup XSLT:

 ...
 
   ,
 
 ...

per ottenere questo risultato:

mela, arancia, banana,

ma come faccio a produrre una lista in cui non è presente l’ultima virgola? Suppongo che si possa fare qualcosa seguendo le linee di:

 ...
 
   
   , 
 
 ...

ma quale dovrebbe essere l’espressione test?

Ho bisogno di un modo per capire quanto è lunga la lista e dove sono attualmente nella lista, o, in alternativa, se sto elaborando l’ultimo elemento della lista (il che significa che non mi interessa quanto è lungo o cosa la posizione corrente è).

Dai un’occhiata alle position() , count() e last() ; ad esempio, test="position() < last()" .

Questo è un modello abbastanza comune:

    ,   

Per un’opzione XSLT 2.0, è ansible utilizzare l’attributo separator su xsl:value-of .

Questo xsl:value-of :

  

produrrebbe questa uscita:

 apple, orange, banana 

Puoi anche usare più di una virgola per un separatore. Ad esempio, questo:

 '  ' 

Produrrebbe il seguente risultato:

 'apple', 'orange', 'banana' 

Un’altra opzione XSLT 2.0 è string-join()

  
 , 

o (forse più efficiente, ma dovresti testare):

       

Robert ha dato la risposta del classis not(position() = last()) . Ciò richiede di elaborare l’intero elenco di nodes corrente per ottenere le dimensioni del contesto e, nei documenti di input di grandi dimensioni, ciò potrebbe rendere la conversione più ricca di memoria. Pertanto, di solito inverto il test per essere la prima cosa

    

Un semplice liner XPath 1.0 :

concat(., substring(',', 2 - (position() != last())))

Mettilo in questa trasformazione:

         

e applicarlo al documento XML :

  apple orange banana  

per ottenere il risultato desiderato:

apple,orange,banana

MODIFICARE:

Ecco un commento di Robert Rossney a questa risposta:

È un codice piuttosto opaco per un essere umano da leggere. È necessario conoscere due cose non ovvie su XSLT: 1) cosa fa la funzione substring se il suo indice è fuori intervallo e 2) che i valori logici possono essere convertiti implicitamente in valori numerici.

e qui è la mia risposta :

Ragazzi, mai timidi di imparare qualcosa di nuovo. In realtà questo è tutto ciò che riguarda lo Stack Overflow, non è vero? 🙂

Questo è il modo in cui l’ho fatto funzionare per me. Ho provato questo contro la tua lista:

            ,