【问题标题】:How to suppress indentation for XML output in XQuery如何在 XQuery 中抑制 XML 输出的缩进
【发布时间】:2011-12-02 01:52:31
【问题描述】:

有没有办法从 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";

以及上述的其他几种变体,具体取决于 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 客户端。

【问题讨论】:

  • 这样做的方法很蹩脚。只需将 response.getWriter() 包装在您自己的写入器中,该写入器在写入目标写入器时会跳过 \t 。是的,我知道这不是正确的方法 - 但它是快速修复

标签: java xml xquery indentation saxon


【解决方案1】:

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

【讨论】:

  • 我通过添加调用 Saxon 的代码更新了问题。据我所知,我只是将查询结果视为纯文本并将其写入文本流,该文本流作为 HTTP 响应返回给浏览器。
【解决方案2】:

除了 Gunther 声明的内容之外,您还可以在 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】:

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

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

    【讨论】:

      【解决方案4】:

      而不是传入null

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2020-02-11
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2018-08-14
        相关资源
        最近更新 更多