我的目标是使用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, "," ) || "
"
结果:
1,2
3,4
5,6
我无法在&#39;清洁&#39;中删除这个额外的空间。方式(即:没有后处理结果)。
任何想法如何产生一个“清洁&#39; csv(文本)文件?
答案 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, "," ),
"
"
)
答案 1 :(得分:1)
为了完整性,还有第二个答案不需要修改查询。
默认情况下,序列化时在项目之间添加额外的空格。
如果将序列化参数item-separator
设置为空字符串,则原始查询将输出所需的输出(没有额外的空格),这将绕过默认行为。每个引擎都有自己的API。
对于Saxon,我认为将其传递给命令行:
!item-separator=''
对于佐巴:
-z item-separator=''