如何在XQuery中抑制XML输出的缩进?

8
有没有一种方法可以在XQuery中取消XML输出的缩进?
例如,假设我有一个XQuery:
<foo><bar/></foo>

生成一个XML结果文档;
<foo>
  <bar/>
</foo>

我该如何去除缩进,让输出文档看起来像这样:
<foo>
<bar/>
</foo>

理想情况下,我希望能够从XQuery本身进行控制,例如在查询开头的声明中。我尝试将如下内容放入XQuery中:
declare namespace saxon="http://saxon.sf.net/";
declare option saxon:output "indent=no";

根据谷歌提供的文档,还有其他几种变体,但XML输出永远不会改变。

我正在使用Saxon,并通过Java XQJ扩展进行调用。

import net.sf.saxon.xqj.SaxonXQDataSource;

这是否是我需要在Java中操作而不是Xquery中进行的操作?

更新

这是我用来调用Saxon的代码。很抱歉这有点长,但我不确定哪些部分是相关的。

private String runXQuery(String query, HttpServletRequest request, String payload)
 throws XQException {

  XQDataSource ds = new SaxonXQDataSource();
  XQConnection conn = ds.getConnection();

  XQPreparedExpression exp = conn.prepareExpression(query);

  bindObject(exp, "HTTP_METHOD", request.getMethod());
  bindObject(exp, "HTTP_URI", request.getRequestURI());
  bindObject(exp, "HTTP_QUERY", request.getQueryString());
  bindObject(exp, "HTTP_COOKIES", request.getHeader("Cookie"));
  bindObject(exp, "HTTP_PAYLOAD", payload);

  XQResultSequence result = exp.executeQuery();          // Run the XQuery.

  StringBuffer buffer = new StringBuffer();

  while (result.next()) {
    buffer.append(result.getItemAsString(null));
    buffer.append(System.getProperty("line.separator"));
  }

  return buffer.toString();

}

上述内容被称为这样:
public void handle(String target, Request baseRequest, HttpServletRequest request,
 HttpServletResponse response) throws IOException, ServletException {

  response.setContentType("text/html;charset=utf-8");
  baseRequest.setHandled(true);

  File file = null;
  String out = "";

  File inbound = new File(root, target);        // File or folder
  file = checkFile(inbound);                    // File.
  String xquery = loadFile(file);
  String payload = getPayload(request.getReader());
  out = runXQuery(xquery, request, payload);
  response.setStatus(HttpServletResponse.SC_OK);
  response.getWriter().println(out);

}

据我所知,我只是将executeQuery()返回的内容作为纯文本输出。
该程序作为一种XQuery服务器工作。它在特定端口监听来自HTTP客户端的对特定XQuery文件的请求。然后加载该文件并将其传递给Saxon运行,最终将Saxon的结果输出回HTTP客户端。

1
有一种愚蠢的方法可以做到这一点。只需将response.getWriter()包装在自己的writer中,该writer在向目标writer写入时跳过\t。是的,我知道这不是正确的方法 - 但它是快速修复。 - SirVaulterScoff
4个回答

1

不要传递null

buffer.append(result.getItemAsString(null));

根据 getItemAsString 的文档建议,应该传递一个 Properties 对象,其中包含一个设置为 "no"indent 键,正如 XSLT 2.0 和 XQuery 1.0 Serialization reference 中所述。

实际上,这不是一个 XQuery 执行问题,而是一个问题,即将实际上没有任何格式的节点集合转换为字符串或 StringBuffer ,然后包含格式。


0
除了Gunther所说的,您还可以在XQuery Prolog中定义此选项:
declare namespace saxon = "http://saxon.sf.net/";
declare option saxon:output "indent=no";

如果您不必使用Saxon,BaseX提供了设置indents选项(类似于Saxon的indent-spaces)并且免费的可能性。

您只需要使用以下两行:

declare option output:indent "yes";
declare option output:indents "0";

0

这里不太清楚出了什么问题。但是您没有解释您如何生成输出。您在XQJ中如何运行查询,以及将其输出发送到哪里?(根据您提供的信息,可能序列化甚至不是由查询处理器执行的 - 例如,您可能正在将输出写入DOM,然后序列化DOM。)


我已经通过添加调用Saxon的代码更新了问题。据我所知,我只是将查询结果视为纯文本,并将其写入返回给浏览器作为HTTP响应的文本流。 - Nigel Alderton

0

你可以尝试声明选项saxon:output "method=text"; 或者尝试声明选项saxon:output "method=xml";

如果这些方法都不起作用,你可以在输出之前剥离特殊字符并修剪它们。干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接