2011-10-06 46 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,然後它包含格式。