在将XML序列化为文本时如何防止其他空格(csv)

时间:2017-05-19 11:58:20

标签: csv xquery saxon xquery-3.0

我的目标是使用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

我无法在&#39;清洁&#39;中删除这个额外的空间。方式(即:没有后处理结果)。

任何想法如何产生一个“清洁&#39; csv(文本)文件?

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

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

对于Saxon,我认为将其传递给命令行:

!item-separator=''

对于佐巴:

-z item-separator=''