XSLT: копировать текст элемента, который сам по себе является xml-документом, без использования value-of

#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 в качестве обходного пути для нечетного времени, когда это происходит.