2017-05-19 5 views
3

私の目標は、Saxonを使用してXMLからCSVファイルを生成することです。最初の結果ライン後の各ラインの結果でサクソンで以下(!簡体字)のXQuery(PE、9.7.0.15)を実行する場合、追加のスペースが追加されている:XMLをテキスト(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;" 

結果:

1,2 
3,4 
5,6 

「クリーン」な方法でこの追加領域を削除することはできません(つまり、結果を後処理することなく)。

「クリーンな」csv(テキスト)ファイルを生成する方法はありますか?

答えて

3

私は唯一の欠落は、外側の文字列-参加だったと思う:完全のために

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

、クエリを変更する必要がない第二の答えがあります。

デフォルトでは、シリアル化時にアイテム間に余分なスペースが追加されます。

シリアライズパラメータitem-separatorを空の文字列に設定すると、元のクエリは必要な出力を出力します(余分なスペースは不要です)。デフォルトの動作をバイパスします。各エンジンには独自のAPIがあります。サクソンのために

、私はそれは、コマンドラインにこれ​​を渡すようなものになるだろうと思う:STDシリアル化オプションがあるのXQuery 3.xのため

-z item-separator='' 
+0

:ゾルバについては

!item-separator='' 

HTTPS ://www.w3.org/TR/xslt-xquery-serialization-31/#XML_ITEM-SEPARATORしかし、それは私を助けてくれませんでした。 – DiZzZz

関連する問題