2011-10-06 19 views
7

在XQuery中有没有办法去除XML输出的缩进?如何在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吗?

更新

这是我用来调用撒克逊的代码。我很抱歉,这里有很多,但我不确定什么是相关的;

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()包装在自己的作者中,即可在写入目标作者时跳过\ t。是的,我知道这不是一个正确的方法 - 但它是quickfix – SirVaulterScoff

回答

0

这不是什么问题。但是你没有解释你是如何产生输出的。您在XQJ中运行查询的具体方式是什么,以及您在哪里发送其输出? (根据您提供的信息,可能是序列化甚至没有被查询处理器完成 - 例如,您可能会将输出写入DOM,然后串行化DOM。)

+0

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

0

冈瑟statet,你也得定义XQuery Prolog中这个选项的可能性:

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

如果你没有绑定撒克逊,BaseX提供设置indents - 选项(类同Saxon的indent-spaces)的可能性并且是免费的。

你只需要使用以下两行:

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

你可以尝试声明选项撒克逊:输出“的方法=文本”;或者你可以尝试声明选项saxon:output“method = xml”;

如果他们不工作,你可以去掉特殊字符并在输出前修剪它们。干杯!

1

而是在

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

传递null你应该通过Properties对象,由文档getItemAsString,其中包含一个indent键值设为"no"作为XSLT 2.0 and XQuery 1.0 Serialization reference记录的建议的。

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