【发布时间】: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