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

时间:2011-10-06 08:26:40

标签: java xml xquery indentation saxon

是否有一种方法可以在XQuery中删除XML输出的缩进?

EG。说我有一个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";

以上的其他几种变体取决于Google引发的文档,但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客户端。

4 个答案:

答案 0 :(得分:1)

而不是在

中传递null
buffer.append(result.getItemAsString(null));

您应该按照getItemAsString的文档的建议传递一个Properties对象,该文档包含indent密钥设置为"no",如XSLT 2.0 and XQuery 1.0 Serialization reference中所述。

实际上,这不是XQuery执行问题,而是一个问题,XQuery的结果实际上是一个没有任何格式的节点集的结果是如何转换为字符串或StringBuffer然后包含格式。< / p>

答案 1 :(得分:0)

这里的问题并不明显。但是你还没有解释你是如何产生输出的。究竟如何在XQJ中运行查询,以及在哪里发送输出? (根据您提供的信息,可能是查询处理器甚至没有完成序列化 - 例如,您可能正在将输出写入DOM,然后将DOM序列化。)

答案 2 :(得分:0)

除了Gunther statet之外,您还可以在XQuery Prolog中定义此选项:

declare namespace saxon = "http://saxon.sf.net/";
declare option saxon:output "indent=no";

如果你没有受到撒克逊人的约束,BaseX可以设置indents - 选项(类似于撒克逊的indent-spaces)并且是免费的。

您只需要使用以下两行:

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

答案 3 :(得分:0)

你可以尝试声明选项saxon:output“method = text”;或者你可以尝试声明选项saxon:输出“method = xml”;

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