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;应自动转换为操作系统特定的行尾。

于 2012-03-22T20:46:19.217 回答
0

基于@grtjn 的答案:

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

根据操作系统或应用程序,可以对行尾进行不同的处理。您可以尝试替代字符(一个或两个):

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

此外,这可能会被用于查看 CSV 的应用程序所阻止。例如,大多数版本的 Microsoft Excel 会将单元格中的所有空格(包括换行符)转换为纯空格。

于 2012-03-23T19:09:42.357 回答