3

我的目标是使用 Saxon 从 XML 生成 CSV 文件。在 Saxon (PE, 9.7.0.15) 中运行下面的(简化的!)xquery 时,在第一条结果行之后的每一行的结果中,都会添加一个额外的空格:

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(文本)文件吗?

4

2 回答 2

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;"
)
于 2017-05-19T12:58:37.143 回答
1

为了完整起见,还有第二个答案不需要修改查询。

默认情况下,在序列化时会在项目之间添加额外的空格。

item-separator如果您将序列化参数设置为空字符串,原始查询将输出所需的输出(没有额外的空格) ,这将绕过默认行为。每个引擎都有自己的 API 来执行此操作。

对于撒克逊人,我认为这类似于将其传递给命令行:

!item-separator=''

对于佐巴:

-z item-separator=''
于 2017-05-19T13:06:08.887 回答