2017-05-19 1 views
3

Mon but est de générer un fichier CSV en XML en utilisant Saxon. Lors de l'exécution (! Simplifié) XQuery ci-dessous à Saxon (PE, 9.7.0.15), dans le résultat de chaque ligne après la première ligne de résultat, un espace supplémentaire est ajouté:Comment éviter les espaces supplémentaires lors de la sérialisation de XML en texte (csv)

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 

declare option output:method "text"; 

let $document := <A> 
        <B><C>1</C><D>2</D></B> 
        <B><C>3</C><D>4</D></B> 
        <B><C>5</C><D>6</D></B> 
       </A> 

for $b in $document/B 
return string-join(for $x in $b/* return $x, ",") || "&#xa;" 

le résultat:

1,2 
3,4 
5,6 

Je ne peux simplement pas supprimer cet espace supplémentaire de manière «propre» (c'est-à-dire: sans post-traitement du résultat).

Une idée de comment générer un fichier csv (Text) 'clean'?

Répondre

3

Je pense que la seule chose qui manquait était une chaîne extérieure jointure:

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 

declare option output:method "text"; 

string-join(
    let $document := <A> 
        <B><C>1</C><D>2</D></B> 
        <B><C>3</C><D>4</D></B> 
        <B><C>5</C><D>6</D></B> 
        </A> 
    for $b in $document/B 
    return string-join(for $x in $b/* return $x, ","), 

    "&#xa;" 
) 
1

Pour être complet, il y a une deuxième réponse qui ne nécessite pas de modifier la requête.

Par défaut, des espaces supplémentaires sont ajoutés entre les éléments au moment de la sérialisation.

La requête d'origine affichera la sortie souhaitée (sans espaces supplémentaires) si vous définissez le paramètre de sérialisation item-separator sur une chaîne vide, ce qui contournera le comportement par défaut. Chaque moteur a sa propre API pour le faire.

Pour Saxon, je pense que ce serait quelque chose comme la passer à la ligne de commande:

!item-separator='' 

Pour Zorba:

-z item-separator='' 
+0

3.x XQuery il y a une option de sérialisation std: https : //www.w3.org/TR/xslt-xquery-serialization-31/#XML_ITEM-SEPARATOR mais cela ne m'a pas aidé (aurait dû le mentionner avant, désolé) – DiZzZz