2011-10-06 12 views
7

¿Hay alguna manera desde dentro de un XQuery de eliminar la indentación de la salida XML?Cómo suprimir la sangría para la salida XML en XQuery

Ej. dicen que tuve un XQuery de;

<foo><bar/></foo> 

produciendo un documento de resultado XML de;

<foo> 
    <bar/> 
</foo> 

¿Cómo puedo eliminar las sangrías por lo que el documento de salida se veía así;

<foo> 
<bar/> 
</foo> 

Idealmente quiero algo que pueda controlar con XQuery, por ejemplo. en las declaraciones al inicio de la consulta. Intenté poner cosas como esta en XQuery;

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

Y muchas otras variaciones de las anteriores dependiendo de la documentación que Google arroje, pero la salida XML nunca cambia.

Estoy usando Saxon y lo llamo a través de las extensiones Java XQJ;

import net.sf.saxon.xqj.SaxonXQDataSource; 

es algo que tendría que hacer en Java no Xquery?

actualización

Este es el código que estoy usando para llamar sajón. Lamento que haya bastante, pero no estoy seguro de qué será relevante;

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

} 

Lo anterior se llama así;

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

} 

Por lo que yo sé, yo soy sólo la salida de lo que viene detrás de executeQuery() como texto sin formato.

El programa funciona como una especie de servidor XQuery. Escucha en un puerto específico una solicitud de un cliente HTTP para un archivo XQuery específico. A continuación, carga ese archivo y lo pasa a Saxon para que se ejecute, y luego envía el resultado de Saxon al cliente HTTP.

+1

Hay una manera coja de hacer esto. Simplemente ajuste el response.getWriter() en su propia grabadora que se salta \ t mientras escribe al escritor de destino. Sí, sé que no es una forma correcta, pero es quickfix – SirVaulterScoff

Respuesta

0

No es obvio cuál es el problema aquí. Pero no has explicado cómo estás generando la salida. Exactamente cómo está ejecutando la consulta en XQJ, y dónde está enviando su salida? (A partir de la información que ha proporcionado, es posible que la serialización ni siquiera esté siendo procesada por el procesador de consultas, por ejemplo, podría escribir salida en un DOM y serializar el DOM.)

+0

He actualizado la pregunta agregando el código que llama a Saxon. Hasta donde yo sé, estoy tratando el resultado de la consulta como texto sin formato y escribiéndola en una secuencia de texto que se devuelve al navegador como respuesta HTTP. –

0

Adicional a lo que Gunther Statet, también tienes la posibilidad de definir esta opción en XQuery Prolog:

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

Si no está obligado a Saxon, BaseX ofrece la posibilidad de ajustar la indents -option (similar a sajón de indent-spaces) y es gratis.

sólo se necesita usar las dos líneas siguientes:

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

podrían intenta declarar la opción de salida sajón: "method =" texto; o podría intentar declarar la opción saxon: salida "method = xml";

Si no funcionan, podría quitar los caracteres especiales y recortarlos antes de imprimirlos. ¡Aclamaciones!

1

En lugar de pasar null en

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

debe pasar un objeto Properties, como se sugiere en la documentación de getItemAsString, que contiene un conjunto indent clave para "no" tal como se documenta en el XSLT 2.0 and XQuery 1.0 Serialization reference.

En realidad, esto no es un problema de ejecución de XQuery, sino una pregunta de cómo el resultado de XQuery que es realmente un conjunto de nodos sin ningún formato se convierte a la cadena o StringBuffer que contiene formato.

Cuestiones relacionadas