Есть ли известная ошибка Saxon-JS при обработке CDATA, содержащих элементы?

Я хотел бы знать, есть ли известная ошибка в том, как Saxon-JS обрабатывает элементы, содержащие CDATA.

У меня есть рабочий процесс XSLT 3.0 и XML, который включает в себя получение текста из элемента, содержащего CDATA, и применение разметки HTML при преобразовании. Попробую задать вопрос, не выкладывая скрипт.

Я использую Saxon-HE 9.8.0.3 и пробую последний Saxon-JS. Все, что преобразовано из файлов .xsl в файлы .sef, работает, за исключением ожидаемого формата текста, взятого из элемента, содержащего CDATA.

У меня есть элемент <docText>, который содержит только <![CDATA[ ... ]]> многострочный текст.

Я вызываю шаблон примерно так: <xsl:apply-templates select="ancestor::document/docText"/>

Я совпадает с <xsl:template match="docText/text()">

Последняя обработка текста в <docText>, содержащегося в переменной, выводится следующим образом: <xsl:value-of select="$step9-2" disable-output-escaping="yes" />

Опять же, вывод верен с рабочей разметкой HTML, когда я использую исходное преобразование с Saxon-HE, XML и XSLT 3.0 из командной строки на Java. Сценарий преобразования почти идентичен для использования с Saxon-JS, и работает вся логика, кроме форматирования текста, изначально находящегося в разделах CDATA. Текст выводится, но в неформатированном виде.

Есть ли причина, по которой ошибка может быть связана с тем, как Saxon-JS обрабатывает или не обрабатывает разделы CDATA, как это делает Saxon-HE?

Майкл


person Sawtooth67    schedule 18.02.2018    source источник
comment
Интересно, является ли это разделом CDATA, как вы думаете, или не просто использованием disable-output-escaping. Как вы используете XSLT 3 с Saxon-JS, есть ли какое-либо использование API, при котором вы сериализуете результат, чтобы disable-output-escaping мог иметь какой-либо эффект?   -  person Martin Honnen    schedule 18.02.2018
comment
Мой XSLT в основном 2.0, но я объявил версию = 3.0 в таблице стилей. Возможно, мне следовало упомянуть, что я преобразовал свой файл .xsl, который был изменен для работы с Saxon-JS, в файл .sef с OxygenXML 19.1. Без публикации всего кода, возможно, только саксонские разработчики смогут ответить. Спасибо за вклад.   -  person Sawtooth67    schedule 18.02.2018


Ответы (2)


См. http://www.saxonica.com/saxon-js/documentation/index.html#!conformance/xslt30, говоря

Saxon-JS не реализует следующие дополнительные функции спецификации: осведомленность о схеме, сериализацию, потоковую передачу, функции высшего порядка и отключение-вывод-экранирование.

person Martin Honnen    schedule 18.02.2018
comment
Я не заметил исключенных функций, размещенных на сайте Saxon-JS. Но я не уверен, что это единственная проблема. Я не вижу доказательств того, что вызов, который я перечислил выше от docText, был даже сопоставлен с шаблоном docText/text(). Я протестировал, удалив соответствующий шаблон из моего рабочего решения и получив аналогичную конкатенацию текста. В любом случае, указанное вами исключение, по крайней мере, дает мне понять, что мне нужно искать другое решение. Спасибо за уделенное время. - person Sawtooth67; 18.02.2018
comment
Встроенные правила шаблона будут обрабатывать дочерние узлы любого элемента docText, не обрабатываемого вашими собственными шаблонами, а затем встроенные шаблоны для текстовых узлов будут выводить текстовый узел. Итак, учитывая информацию, которую вы опубликовали до сих пор, и ограничения Saxon-JS, результат кажется ожидаемым. Какой у вас контекст в разделе CDATA, разве вы не можете разобрать его с помощью parse-xml-fragment на узлы и вывести их с помощью xsl:copy-of или xsl:sequence? - person Martin Honnen; 19.02.2018
comment
Я ранее публиковал свой контекст, и вы дали несколько полезных подробных ответов. В моем CDATA есть простой текст с ограниченной разметкой, обозначенной окончаниями строк, заключенными в скобки знаками / словами форматирования и случайной разметкой HTML. С решениями, которые вы предлагали ранее, я обычно могу пройти около 80% пути, но всегда заканчиваю тем, что я, кажется, не могу пройти. Мои преобразования создают HTML-документы и ePub-файлы на основе содержимого. Когда-нибудь я могу пойти на это снова. Я пробовал <xsl:value-of select="parse-xml-fragment($step9-2)/*" /> вместо первой опубликованной строки. Спасибо хоть. - person Sawtooth67; 19.02.2018
comment
Что ж, xsl:value-of никогда не создаст никаких узлов элементов, даже если вам удастся разобрать разметку на узлы элементов, поэтому вам придется использовать xsl:copy-of или xsl:sequence, если вы хотите вывести узлы элементов. Если разметка не является XML, поэтому parse-xml или parse-xml-fragment не работают, тогда, как указал Майкл, в Saxon-JS вы можете вызывать Javascript, где DOMParser для полных документов или Range.createContextualFragment позволяет анализировать строки разметки HTML. - person Martin Honnen; 19.02.2018
comment
Я экспериментировал с вызовом Javascript из Saxon-JS для использования createContextualFragment, пример находится на martin-honnen.github.io/xslt/2018/test201802190101.html, исходный код файлов находится в сети по адресу github.com/martin-honnen/martin-honnen.github.io/blob/master/ и github.com/martin-honnen/ martin-honnen.github.io/blob/master/. HTH - person Martin Honnen; 19.02.2018
comment
Я попытался изменить xsl:value-of select на xsl:sequence select="parse-xml-fragment($var)", это восстановило содержимое в формате HTML с одной проблемой, которую я пытаюсь расшифровать. Когда он встречает html, как в этом примере <span epub:type="pagebreak" id="page130" title="130">[page 130] 129</span>, оставшаяся часть записи обрезается. Следующая запись отображается правильно до тех пор, пока не будет достигнут аналогичный фрагмент html, затем то же самое. Вчера я собирался прекратить пробовать этот путь, но ценю вашу настойчивость и время. Я изучу другие ваши предложения. Спасибо за образцы кода. МБ - person Sawtooth67; 20.02.2018

Да, существует известная проблема: https://saxonica.plan.io/issues/3385

Не видя больше вашего кода, я не уверен, актуальна ли эта проблема. Ошибка говорит о том, что разделы CDATA преобразуются в текстовые узлы, если действует удаление каких-либо пробелов, но не в противном случае, поэтому полезным экспериментом будет посмотреть, что произойдет, если вы добавите в свою таблицу стилей

<xsl:strip-space elements="a-dummy-element-name"/>

Это вызовет удаление пробелов, что также приведет к превращению узлов CDATA в обычные текстовые узлы.

Однако это не решит проблему, заключающуюся в том, что ваш код зависит от отключения-вывода-экранирования. Если ваш CDATA / текстовый узел содержит разметку HTML, которую необходимо скопировать на страницу HTML, единственный способ сделать это в Saxon-JS - это проанализировать HTML в дереве узлов и добавить узлы в HTML DOM. Если HTML является правильно сформированным XML, вы можете сделать это с помощью функции parse-xml (); в противном случае вам, возможно, придется обратиться к Javascript.

person Michael Kay    schedule 19.02.2018
comment
Я проверю ситуацию с удалением пробелов. Несмотря на это, я, вероятно, не получу нужный мне результат без отключения-вывода-экранирования без полной перезаписи рабочего кода, который у меня есть сейчас. Моя основная цель состояла в том, чтобы использовать форму для ввода параметра, который я ранее вводил в командной строке с помощью Saxon-HE. Вот почему я хотел поэкспериментировать с Saxon-JS. Это сработало, за исключением того, что я не получал форматирования из контента, который начинался в разделах CDATA, по причине, о которой вы и Мартин указываете. Спасибо за ответ. - person Sawtooth67; 19.02.2018