Как прочитать значение узла с Saxon s9api, используя xpath, сохраняя символы новой строки только в CDATA - PullRequest
0 голосов
/ 07 декабря 2018

Имея следующую структуру XML:

<Data>
    line 1
    line 2  and some text
 </Data>

Я бы хотел получить содержимое узла Данные , используя xpath // Data / text ()

Однако выполнение xpath с использованием s9api приводит к следующей строке:

     line 1
     line 2  and some text

Где сохраняются новые строки и двойные пробелы.Это был бы тот результат, который я хотел получить, если бы узел Data содержал свое значение в разделе CDATA, но это не так.

После фрагмента Java, используемого для выполнения xpath на узле данных:

XPathExecutable exp = xPathCompiler.compile("text()");
XPathSelector selector = exp.load();
selector.setContextItem(item);
XdmItem evaluateSingle = selector.evaluateSingle();
result = evaluateSingle == null ? null : evaluateSingle.getStringValue();

Я бы хотел, чтобы результирующий пробел нормализовался: строка 1, строка 2 и некоторый текст

Конечно, я мог бы использовать xpath // Data / normalize-space () , чтобы получить нормализованную строку, однако желательно определить это программно: сохранить пробелы, когда CDATAsection используется в XML и в противном случае нормализует результат.

Есть ли способ узнать, следует ли сохранять пробелы при выполнении xpath с использованием s9api?Или какое-нибудь предложение, как решить эту проблему?

Другими словами: когда пробелы значительны, я бы хотел их сохранить, в противном случае пробелы следует нормализовать.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Ну, я искал способ заключить договор между моим приложением и пользователем о сохранении пробелов.Поскольку CDATA уважал CDATA при форматировании XML, я хотел сделать это таким же образом.

Полагаю, я буду использовать следующий подход: если узел содержит атрибут xml: space сзначение preserve , тогда я сохраню все пробелы, получив значение узла, используя xpath text () .

В противном случае xpath normalize-space () будет использоваться для получения значения нормализации узла, удаляя все начальные и конечные пробелы, а также двойные пробелы.

Используется Xpath 2:

if (@xml:space = 'preserve') then text() else normalize-space()

Спасибоза ответы!

0 голосов
/ 07 декабря 2018

Я не знаю, почему вы думаете, что разделы CDATA должны изменить семантику пробелов.CDATA - это просто способ пометить текст, который не был экранирован ссылками на сущности, такими как &lt; и &gt;.

Конечно, одним из правил XML является то, что это просто синтаксис, и вы можете присоединитьлюбая семантика для любых конструкций разметки, которые вам нравятся, включая разделы CDATA.Однако, если вы придаете значение разметке CDATA, XSLT и XQuery вам не помогут, потому что они явно игнорируют это.

...