1

以下の例のような構造の XML があり、MarkLogic で XQuery を作成して、これを CSV にエクスポートしました (以下の XML を参照)。

私が助けを必要としているのは、出力をフォーマットして、CSV ファイルを開くときに、すべての出力を 1 にまとめるのではなく、いわば「列」にグループ化することです。

以下のサンプルでは、​​すべての DataTime 要素と Source 要素の値を出力し、次のように独自の列に値を入れたいとします。

2012-02-15T00:58:26 a
2012-02-15T00:58:26 b
2012-02-15T00:58:26 c

どうすればそれについて行くでしょうか?

参照ポイントやヘルプを歓迎します。前もって感謝します。

サンプル XML は次のとおりです。

<Document xmlns="http://fakeexample.org/schemas">
    <Information>
        <ItemId>1f28cb0c2c4f4eb7b13c4abf998e391e</ItemId>
        <MediaType>Text</MediaType>
        <DocDateTime>2012-02-15T00:58:26</DocDateTime>
    </Information>
    <FilingData>
        <DateTime>2012-02-15T00:58:26</DateTime>
        <Source>a</Source>
        </FilingData>
    <FilingData>
        <DateTime>2012-02-15T00:58:27</DateTime>
        <Source>b</Source>
    </FilingData>
    <FilingData>
        <DateTime>2012-02-15T00:58:28</DateTime>
        <Source>c</Source>
    </FilingData>
</Document>

XQuery のサンプルは次のとおりです。

xquery version "1.0-ml";

declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare namespace xdmp="http://marklogic.com/xdmp";
declare namespace exam="http://fakeexample.org/schemas";

declare function local:getDocument($url)
{

let $response := xdmp:document-get($url, 
       <options xmlns="xdmp:document-get">
           <repair>full</repair>
           <format>xml</format>
       </options>)

return $response
};

xdmp:set-response-content-type("text/csv"),
xdmp:add-response-header(
      "Content-disposition",
      fn:concat("attachment;filename=", "output", fn:current-time(), ".csv")
    ),
(
let $q := cts:element-value-query(xs:QName("exam:ItemId"), ("1f28cb0c2c4f4eb7b13c4abf998e391e"))

let $results := cts:search(fn:doc(), $q)

for $result in $results
return  fn:string-join((xs:string($result//exam:DateTime),
                        xs:string($result//exam:Source)                     
                        ), "," )
)
4

2 に答える 2

3

for ループを次のように置き換えます。

return

string-join(
    for $result in $results//FilingData
    return  fn:string-join((xs:string($result//exam:DateTime),
                    xs:string($result//exam:Source)                     
                    ), "," )
, "&#10;")

それは約トリックを行う必要があります..

//FilingData編集:後ろに追加したことに注意してください$results。これにより、各 FilingData の DateTime と Source が個別に結合され、for ループの個別の文字列として返されるようになります。これにより、外側の文字列結合で、それらの間に必要な行末を追加できます。

注: &#10;OS 固有の行末に自動的に変換する必要があります。

于 2012-03-22T20:46:19.217 に答える
0

@grtjnによる回答に基づいて構築:

string-join(..., "&#10;")

OS やアプリケーションによっては、行末の扱いが異なる場合があります。別の文字を試すことができます (どちらかまたは両方):

"&#x0A;" (LF) 
"&#x0D;" (CR)

また、これは、CSV の表示に使用されるアプリケーションによって妨害される可能性があります。たとえば、ほとんどのバージョンの Microsoft Excel では、セル内のすべての空白 (改行を含む) がプレーン スペースに変換されます。

于 2012-03-23T19:09:42.357 に答える