2011-10-06 6 views
7

Esiste un modo all'interno di un XQuery per rimuovere il rientro del output XML?Come sopprimere l'indentazione per l'output XML in XQuery

Es. dire che ho avuto un XQuery di;

<foo><bar/></foo> 

produzione di un documento di risultato XML di;

<foo> 
    <bar/> 
</foo> 

Come rimuovere i rientri in modo che il documento di output fosse simile al seguente;

<foo> 
<bar/> 
</foo> 

Idealmente, desidero qualcosa con cui posso controllare XQuery es. nelle dichiarazioni all'inizio della query. Ho provato a inserire cose come questa in XQuery;

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

E molte altre varianti di quanto sopra a seconda della documentazione di Google, ma l'output XML non cambia mai.

sto usando sassone e chiamando tramite le estensioni Java XQJ;

import net.sf.saxon.xqj.SaxonXQDataSource; 

E 'qualcosa che avrei dovuto fare in Java non query XQuery?

Aggiornamento

Questo è il codice che sto usando per chiamare sassone. Mi dispiace che ce ne sia un bel po 'ma non sono sicuro di cosa sarà rilevante;

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(); 

} 

Quanto sopra è chiamato così;

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); 

} 

Per quanto ne so, io sono solo l'output di tutto ciò che torna dal executeQuery() come testo normale.

il programma funziona come una sorta di server di XQuery. Ascolta su una porta specifica per una richiesta da un client HTTP per un file XQuery specifico. Quindi carica quel file e lo passa a Saxon per l'esecuzione, quindi restituisce il risultato da Saxon al client HTTP.

+1

C'è un modo zoppo di farlo. È sufficiente avvolgere response.getWriter() nel proprio writer che salta \ t durante la scrittura nel writer di destinazione. Sì, lo so che non è un modo corretto - ma è quickfix – SirVaulterScoff

risposta

0

Non è ovvio cosa c'è che non va qui. Ma non hai spiegato come stai generando l'output. Esattamente come stai eseguendo la query in XQJ e dove stai inviando il suo output? (Dalle informazioni che hai fornito, potrebbe essere che la serializzazione non viene ancora eseguita dal processore di query, ad esempio potresti scrivere un output su un DOM e serializzare il DOM.)

+0

Ho aggiornato la domanda aggiungendo il codice che sta chiamando Saxon. Per quanto ne so, sto solo trattando il risultato della query come testo semplice e lo scrivo in un flusso di testo che viene restituito al browser come risposta HTTP. –

0

Oltre a ciò Gunther statet, hai anche avuto la possibilità di definire questa opzione in XQuery Prolog:

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

Se non sei destinato a sassone, BaseX offre la possibilità di impostare il indents -opzione (simile a sassone di indent-spaces) ed è gratuito

si avrebbe solo bisogno di utilizzare le seguenti due linee:

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

potreste provare dichiarare opzione saxon: uscita "method =" text; oppure potresti provare a dichiarare l'opzione saxon: output "method = xml";

Se non funzionano, è possibile rimuovere i caratteri speciali e tagliarli prima di emettere. Saluti!

1

Invece di passare null in

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

si dovrebbe passare un oggetto Properties, come suggerisce la documentazione per getItemAsString, che contiene un set di chiavi a indent"no" come documentato nella XSLT 2.0 and XQuery 1.0 Serialization reference.

In realtà, questo non è un problema di esecuzione XQuery, ma una domanda su come il risultato di XQuery, che in realtà è un insieme di nodi senza alcuna formattazione, viene convertito nella stringa o StringBuffer che quindi contiene la formattazione.

Problemi correlati