Cadena concat XSLT, eliminar la última coma

Necesito construir una cadena usando XSLT y separar cada cadena con una coma, pero no incluir una coma después de la última cadena. En mi ejemplo a continuación, tendré una coma final si tengo un nodo de Distribución y no un nodo Nota, por ejemplo. No sé de todos modos para construir una cadena como una variable y luego truncar el último carácter en XSLT. También esto está usando el motor Microsoft XSLT.

Mi cadena =

 ,   ,   ,   ,     

[Hombre, debe haber una mejor manera de ingresar a este cuadro de texto de pregunta :(]

Esto es muy fácil de lograr con XSLT ( no es necesario capturar los resultados en una variable, o usar plantillas especiales con nombre ):

I. XSLT 1.0 :

      ,    

cuando esta transformación se aplica en el siguiente documento XML:

   Locality CollectorAndNumber Institution Distribution  Unimportant   

el resultado deseado es producido :

 Locality,CollectorAndNumber,Institution,Distribution 

Si los elementos buscados no se deben producir en orden de documentos (algo no requerido en la pregunta, pero planteado por Tomalak), sigue siendo bastante fácil y elegante lograr esto:

        ,    

Aquí los nombres de los elementos deseados y su orden deseada se proporcionan en el parámetro de cadena $porderedNames , que contiene una lista separada por espacios de todos los nombres deseados .

Cuando la transformación anterior se aplica en el mismo documento XML, se produce el resultado deseado :

 CollectorAndNumber,Locality,Distribution,Institution 

II. XSLT 2.0 :

En XSLT, esta tarea es incluso más simple ( nuevamente, no es necesaria ninguna función especial ):

       

Cuando esta transformación se aplica en el mismo documento XML, se produce el mismo resultado correcto :

 Locality,CollectorAndNumber,Institution,Distribution 

Tenga en cuenta que los elementos deseados se producirán en el orden deseado, porque estamos utilizando el tipo de secuencia XPath 2.0 (frente a la unión en la solución XSLT 1.0), que por definición contiene elementos en cualquier orden deseado (especificado).

Preferiría una plantilla de llamada corta para unir los valores de los nodos. Esto también funciona si falta un nodo en el medio de su lista concatenada, por ejemplo, Institution :

           

Aquí hay un breve ejemplo de cómo usarlo:

Documento de entrada de muestra:

 < ?xml version="1.0" encoding="utf-8"?>   locality1 collectorAndNumber1 distribution1 note1   locality2 collectorAndNumber2 institution2 distribution2 note2   locality3 collectorAndNumber3 institution3 distribution3   

Transformación XSL:

 < ?xml version="1.0" encoding="utf-8"?>                           

Documento de salida generado:

 < ?xml version="1.0" encoding="utf-8"?>  locality1,collectorAndNumber1,distribution1,note1 locality2,collectorAndNumber2,institution2,distribution2,note2 locality3,collectorAndNumber3,institution3,distribution3  

NB: si estuvieras usando XSLT / XPath 2.0, entonces habría fn: string-join

 fn:string-join**($operand1 as string*, $operand2 as string*) as string 

que podría usarse de la siguiente manera:

 fn:string-join({Locality, CollectorAndNumber, Distribution, Note}, ",") 

Supongamos que tiene algo así como el siguiente XML de entrada:

   Locality CollectorAndNumber Institution Distribution Note Unimportant   

Entonces esta plantilla lo haría:

                ,   

Salida en mi sistema:

 Locality,CollectorAndNumber,Institution,Distribution,Note 

Creo que podría ser útil mencionar que position () no funciona bien cuando uso una selección complicada que filtra algunos nodos, en ese caso surgió cuál es este truco:

puede definir una variable de cadena que contenga el valor de los nodos, separados por un carácter específico, y luego mediante str: tokenize () puede crear una lista de nodos completa cuya posición funciona bien con ella.

algo como esto:

           ,    ,  

¿No tienes un valor que siempre estará ahí? Si lo haces, puedes darle la vuelta y poner comas delante de todo aparte del primer elemento (que sería tu valor que siempre está ahí).

Esto sería un poco complicado, pero podría hacer el truco si solo hay unos pocos elementos como en su ejemplo: