【问题标题】:How to prevent additional spaces when serializing XML to text (csv)将 XML 序列化为文本 (csv) 时如何防止额外的空格
【发布时间】:2017-10-19 13:17:42
【问题描述】:

我的目标是使用 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(文本)文件吗?

【问题讨论】:

    标签: csv xquery saxon xquery-3.0


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      !item-separator=''
      

      对于佐巴:

      -z item-separator=''
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2014-12-12
      • 2018-11-22
      相关资源
      最近更新 更多