MarkLogic 5 возвращает элементы, завернутые в CDATA

Я пытаюсь заставить MarkLogic5 возвращать элементы, заключенные в тег CDATA, но он просто отказывается. Не бьет, просто не делает. Я лаю не на то дерево, используя: -

xquery version "1.0-ml";

declare option xdmp:output "cdata-section-elements = text";

<text><![CDATA[\begin{eqnarray}
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},
            \end{eqnarray} ]]>
</text>

Просто возвращается без тега CDATA, что противоречит всей документации, которую я могу найти. Я пробовал вернуть контент несколькими способами, например xdmp:quote, но поскольку мне нужно проанализировать контент с помощью XSLT на другом конце, его действительно нужно обернуть в CDATA. элемент.

Контент обычно глубоко вложен, но я здесь для простоты упростил.

Какие-нибудь подсказки?

Обновить

Согласно ответам Рона и Дэвида, на самом деле он добавлял CDATA, это были только мои различные IDE, включая qconsole и eclipse. , скрывая это от меня для удобства.

Тем не менее, причина, по которой я пытался обеспечить, чтобы эти элементы были заключены в CDATA, заключается в том, что он является частью более крупного документа XML, встроенного в другой, и JAXB захлебнулся этим конкретным контентом, а также пользовательскими инструкциями по обработке, такими как <?THING content ?>. Это была просто попытка обмануть JAXB, чтобы он трактовал его как строку.


person James    schedule 20.08.2013    source источник
comment
Как вы выполняете этот запрос? Если вы запустите его в cq или qconsole, эти инструменты будут использовать свои собственные настройки сериализации. Параметры не выводят CDATA, но XML будет точно эквивалентен.   -  person mblakele    schedule 20.08.2013


Ответы (3)


Как предположил Майк, похоже, что именно рендеринг в браузере с QC вызывает исчезновение CDATA. Я изменил образец XQuery на это:

xquery version "1.0-ml";

declare option xdmp:output "cdata-section-elements = text";

xdmp:save ("/tmp/testfoo.xml", 
<text><![CDATA[\begin{eqnarray}
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},
        \end{eqnarray} ]]>
</text>
)

Глядя на файл на диске, он выглядит так:

<text><![CDATA[\begin{eqnarray}^
 \fl {R}_{\mathrm{sw}(e)}=\nonumber\\ \fl \biggl \{ \frac{3{L}_{1}{L}_{2}{Q}_{\mathrm{after}}}{1 2{k}_{h}{A}_{h}\Delta T({L}_{1}+{L}_{2})-({L}_{1}+{L}_{2})^{2}({Q}_{\mathrm{before}}-{Q}_{\mathrm{after}})}-1\biggr \} \nonumber\\ \times ~\frac{{L}_{1}{L}_{2}}{({L}_{1}+{L}_{2}){k}_{h}{A}_{h}}-{R}_{j}-{R}_{\mathrm{CNT}},^M
        \end{eqnarray}
]]></text>

Когда QC обрабатывает XML, полученный в результате вашего запроса, CDATA удаляется, поскольку он никогда не хранится внутри MarkLogic. Так что его больше нет, когда QC сериализует свой вывод в ваш браузер.

person Ron Hitchens    schedule 21.08.2013

Любопытно, не могли бы вы сослаться на любую из «Всей документации, которую я могу найти», в которой говорится, что MarkLogic будет выводить узлы CDATA? ».

В любом случае зачем вам нужны разделы CDATA? Текст будет правильно закодирован и обработан XSLT без CDATA. Нет никакой технической причины, по которой CDATA когда-либо нужен в XML, он существует исключительно для целей редактирования человеком, чтобы упростить необходимость кодирования каждого недопустимого символа по отдельности.

Если вы удалите маркеры CDATA из образца, он будет нормально работать и без них.

-Дэйвид

person DALDEI    schedule 20.08.2013
comment
Образец содержит фигурные скобки, поэтому на самом деле он должен вести себя по-другому с переносом CDATA или без него. На самом деле он должен стать недействительным при удалении CDATA, потому что заключенный в фигурные скобки вряд ли образует допустимое встроенное выражение. Если, конечно, фигурные скобки не удвоены или не заменены сущностями. - person Gunther; 21.08.2013

Похоже, вы обнаружили ошибку MarkLogic. В разделе вывода спецификации XSLT описывается поведение сериализации. вы хотите. И похоже, что MarkLogic утверждает, что поддерживает эту функцию, хотя единственной ссылкой, которую я смог найти в Google или поиске в онлайн-документах ML, была страница, относящаяся к конфигурации сервера приложений по адресу http://docs.marklogic.com/5.0/admin-help/output-options.

На той странице в разделе о output-cdata-section-localname сказано

Это соответствует параметру «cdata-section-elements» как инструкции XSLT xsl: output, так и инструкции пролога MarkLogic XQuery xdmp: output.

Вы можете попробовать настроить сервер приложений (в разделе Output Options) на вывод <text> как CDATA и посмотреть, работает ли он. К сожалению, вы можете установить там только одно QName.

Возможно, формат параметра xdmp: output неверен. В XSLT ожидается, что список QName будет цитироваться, но когда я попытался добавить внутренние кавычки, мне это не понравилось. Вроде парсинг нормально, как будто понимает.

Как заметил Дэвид, CDATA - это на самом деле просто экранирующий синтаксис. Сериализованный XML, который вы получаете, является действительным, правильно сформированным XML. Ваш XSLT-процессор задыхается от этого? Наличие фигурных скобок будет проблемой только в том случае, если вы объедините XML в программу XQuery или что-то подобное. Если вы относитесь к нему как к POX (обычный старый XML), все должно быть в порядке.

person Ron Hitchens    schedule 20.08.2013
comment
Исходный запрос выводит для меня CDATA. Вы пытаетесь заставить его работать через cq или qconsole? Параметры сериализации должны быть на уровне внешнего запроса, и все в cq или qconsole вложено в xdmp:eval. - person mblakele; 20.08.2013
comment
Да, это могло быть так. Попробуйте использовать xdmp: save (), чтобы отправить результат в файл, а затем просмотрите этот файл в текстовом редакторе. - person Ron Hitchens; 21.08.2013