#xml #xslt #copy #value-of
#xml #xslt #Копировать #значение
Вопрос:
Я копирую текстовое содержимое нужного мне элемента (который является встроенным xml-документом) и создаю новый документ из текста, как показано ниже для формата файла, предоставленного мне, который я не контролирую. Проблема в том, что иногда я получаю большие (3 МБ ) текстовые значения (XML-файлы), доставляемые в этом одном элементе, и синтаксический анализатор выходит из строя (пространство кучи java) — я думаю, это потому, что значение не может обрабатывать текст как строку в одном. В идеале я хотел бы просто выполнить копирование или какое-либо преобразование идентификатора, чтобы удалить другие элементы или скопировать без буферизации в строку. Правильно ли я думаю, что это проблема, и есть ли способ? (без добавления дополнительной памяти).
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:value-of select="root/toplevel/row/payload" />
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' ?>
<root>
<toplevel>
<row>
<payload>
amp;<?xml version="1.0" encoding="UTF-8"?>
amp;<documentProperties type="documentProperties">
amp;<producedBy>
amp;<ourName type="string">NAMEHEREamp;</ourName>
amp;<user>Someoneamp;</user>
amp;</producedBy>
amp;</documentProperties>
</payload>
<System>NotWanted</System>
</row>
</toplevel>NotWantedEither
</root>
Обратите внимание, что текст в родственных и родительских элементах в конце нежелателен и иногда включается при нескольких попытках копирования, которые я пробовал. Я хочу только то, что находится в полезной нагрузке. Этот код работает с этим примером, но не тогда, когда текст превышает некоторый предел размера.
Вывод :
<?xml version="1.0" encoding="UTF-8"?>
<documentProperties type="documentProperties">
<producedBy>
<ourName type="string">NAMEHERE</ourName>
......
<.... in practice 3 MB more content in output and source element text here...>
.......
<user>Someone</user>
</producedBy>
</documentProperties>
Комментарии:
1. 3 МБ в этом контексте являются микроскопическими. Если у вас заканчивается место в куче, либо вы установили параметр -Xmx слишком маленьким, либо вы попали в рекурсивный цикл. Покажите свой Java-код и трассировку стека (форматируйте как код).
2. Сбой синтаксического анализатора XML? Почему тогда помогает изменение XSLT? Процессор XSLT обычно работает с базовым анализатором XML для преобразования входных данных XML в представление дерева XDM, но только после этого выполняет код XSLT для дерева. Таким образом, если синтаксический анализатор выйдет из строя, это произойдет раньше
xsl:value-of
, или будет выполнена любая замена.3. Спасибо, Джим, java является частью стороннего приложения. Я не могу его видеть, но я могу настроить Xmx. Сейчас он находится на уровне 1G, и я увеличил тестирование до 3G, но пока безуспешно.
4. Мартин — хорошая мысль, я думаю, я имел в виду процессор xslt ?. Но я также задал вопрос, правильно ли я понял проблему. Он отлично копирует (если также скопированы ненужные части), но завершается сбоем при использовании value-of (нежелательные части не выводятся), поэтому что-то кажется неправильным.
5. Я имел дело с точно такой же проблемой, разница в том, что текстовый узел составляет 53 МБ, а не 3 МБ (плюс, он содержит астральные символы, плюс, он обрабатывается с помощью fn:replace() перед выводом). Какой процессор XSLT вы используете? В последних версиях Saxon есть оптимизация, при которой xsl:value-of может передавать текст непосредственно в сериализатор, но это во многом зависит от деталей выполняемой вами обработки.
Ответ №1:
Не нашел желаемого решения XSLT и нуждался в быстром рабочем процессе. Добавление большего объема памяти решило эту проблему для меня. Увеличено пространство кучи Xmx до 10G в качестве обходного пути для нечетного времени, когда это происходит.