2017-05-19 5 views
3

Mein Ziel ist es, eine CSV-Datei aus XML mit Saxon zu generieren. Wenn der (! Vereinfachte) läuft xquery unten in Saxon (PE, 9.7.0.15), im Ergebnis für jede Zeile nach der ersten Ergebniszeile wird ein zusätzlicher Raum hinzugefügt:So verhindern Sie zusätzliche Leerzeichen beim Serialisieren von XML in Text (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;" 

das Ergebnis:

1,2 
3,4 
5,6 

Ich kann einfach nicht diesen zusätzlichen Raum auf eine "saubere" Weise entfernt (das heißt: ohne das Ergebnis nachbearbeiten).

Irgendwelche Idee, wie man eine 'saubere' csv (Text) Akte erzeugt?

Antwort

3

Ich denke, dass das einzige, was fehlte, war ein Außen string-join:

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

Für Vollständigkeit, gibt es eine zweite Antwort ist, dass die Abfrage nicht modifiziert erfordert.

Standardmäßig werden zusätzliche Leerzeichen zwischen Elementen zur Serialisierungszeit hinzugefügt.

Die ursprüngliche Abfrage gibt die gewünschte Ausgabe (ohne zusätzliche Leerzeichen) aus, wenn Sie den Serialisierungsparameter item-separator auf eine leere Zeichenfolge setzen, wodurch das Standardverhalten umgangen wird. Jede Engine hat dazu ihre eigene API.

Für Saxon, ich denke, es so etwas wie geben diese an die Befehlszeile würde:

!item-separator='' 

Für Zorba:

-z item-separator='' 
+0

für xquery 3.x eine std Serialisierung Option gibt es: https : //www.w3.org/TR/xslt-xquery-serialization-31/#XML_ITEM-SEPARATOR aber das hat mir nicht geholfen (hätte das vorher erwähnen sollen, sorry) – DiZzZz

Verwandte Themen