将 XML 序列化为文本 (csv) 时如何防止出现额外空格

How to prevent additional spaces when serializing XML to text (csv)

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

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

我无法以 'clean' 的方式删除这个额外的 space(即:没有 post 处理结果)。

知道如何生成 'clean' csv(文本)文件吗?

我认为唯一缺少的是外部字符串连接:

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;"
)

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

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

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

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

!item-separator=''

对于左巴:

-z item-separator=''