Как подавить отступ для вывода XML в XQuery - PullRequest
7 голосов
/ 06 октября 2011

Есть ли способ из 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-клиент.

Ответы [ 4 ]

1 голос
/ 28 октября 2011

Вместо прохождения null в

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

Вы должны передать объект Properties, как предлагается в документации для getItemAsString , которая содержит ключ indent, установленный на "no", как описано в справочнике по сериализации XSLT 2.0 и XQuery 1.0. .

На самом деле, это не проблема выполнения XQuery, а вопрос, как результат XQuery, который на самом деле является узлом, заданным без какого-либо форматирования вообще, преобразуется в строку или StringBuffer, которая затем содержит форматирование.

0 голосов
/ 19 октября 2011

В дополнение к тому, что указано Гюнтером, у вас также есть возможность определить эту опцию в XQuery Prolog:

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

Если вы не привязаны к саксону, BaseX предлагает возможность установить опцию indents (аналогично саксонской indent-spaces) и бесплатна.

Вам просто нужно использовать следующие две строки:

declare option output:indent "yes";
declare option output:indents "0";
0 голосов
/ 21 октября 2011

не могли бы вы попытаться объявить опцию saxon: output "method = text";или вы можете попробовать объявить опцию saxon: output "method = xml";

Если они не работают, вы можете удалить специальные символы и обрезать их перед выводом.Ура!

0 голосов
/ 06 октября 2011

Не очевидно, что здесь не так.Но вы не объяснили, как вы генерируете результат.Как именно вы выполняете запрос в XQJ и куда вы отправляете его вывод?(Из предоставленной вами информации может быть, что сериализация даже не выполняется обработчиком запросов - например, вы можете записывать выходные данные в DOM, а затем сериализовать DOM.)

...