将 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, "," ) || "
"
结果:
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, "," ),
"
"
)
为了完整起见,还有第二个答案不需要修改查询。
默认情况下,在序列化时在项目之间添加额外的空格。
如果将序列化参数 item-separator
设置为空字符串,则原始查询将输出所需的输出(没有额外的空格),这将绕过默认行为。每个引擎都有自己的 API 来执行此操作。
对于 Saxon,我认为这类似于将其传递给命令行:
!item-separator=''
对于左巴:
-z item-separator=''
我的目标是使用 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, "," ) || "
"
结果:
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, "," ),
"
"
)
为了完整起见,还有第二个答案不需要修改查询。
默认情况下,在序列化时在项目之间添加额外的空格。
如果将序列化参数 item-separator
设置为空字符串,则原始查询将输出所需的输出(没有额外的空格),这将绕过默认行为。每个引擎都有自己的 API 来执行此操作。
对于 Saxon,我认为这类似于将其传递给命令行:
!item-separator=''
对于左巴:
-z item-separator=''