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

Я копирую текстовое содержимое нужного мне элемента (который представляет собой встроенный XML-документ) и создаю новый документ из текста, как показано ниже, для доставленного мне формата файла, который я не контролирую. Проблема в том, что иногда я получаю большие (3 МБ+) текстовые значения (файлы xml), доставленные в этот элемент, и синтаксический анализатор дает сбой (пространство кучи java) - я думаю это потому, что value-of не может обрабатывать текст как строка в одном. В идеале я хотел бы просто сделать копию или какое-то преобразование идентичности, чтобы удалить другие элементы или скопировать без буферизации в строку. Правильно ли я думаю, что это проблема, и есть ли способ? (без добавления дополнительной памяти).

<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> 
                    &lt;?xml version="1.0" encoding="UTF-8"?>
                            &lt;documentProperties type="documentProperties">
                                &lt;producedBy>
                                    &lt;ourName type="string">NAMEHERE&lt;/ourName>
                                    &lt;user>Someone&lt;/user>
                                &lt;/producedBy>
                            &lt;/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>

person devranred    schedule 21.12.2020    source источник
comment
3 МБ в этом контексте микроскопичны. Если у вас заканчивается место в куче, либо вы установили параметр -Xmx слишком маленьким, либо вы попали в рекурсивный цикл. Покажите свой код Java и трассировку стека (в формате кода).   -  person Jim Garrison    schedule 22.12.2020
comment
Парсер XML дает сбой? Почему тогда помогает изменение XSLT? Процессор XSLT обычно работает с базовым синтаксическим анализатором XML для анализа входных данных XML в представление дерева XDM, но только затем выполняет код XSLT для дерева. Таким образом, если синтаксический анализатор выйдет из строя, это произойдет до того, как будет выполнено xsl:value-of или любая замена.   -  person Martin Honnen    schedule 22.12.2020
comment
Спасибо, Джим, Java является частью стороннего приложения. Я не вижу этого, но я могу настроить Xmx. Сейчас это 1G, и я до сих пор безуспешно перешел на тестирование 3G.   -  person devranred    schedule 22.12.2020
comment
Мартин, хорошее замечание, кажется, я имел в виду процессор xslt? Но я также спросил в вопросе, правильно ли я понял вопрос. Он копируется нормально (если также копируются нежелательные части), но терпит неудачу, когда используется value-of (нежелательные части не выводятся), поэтому что-то кажется неправильным.   -  person devranred    schedule 22.12.2020
comment
Вы ограничены использованием только XSL v 1.0? Если ваш процессор поддерживает XSL v3.0, есть функция parse-xml(). Например, вот документация по реализации Saxon.   -  person Eiríkr Útlendi    schedule 22.12.2020
comment
Я имел дело с точно такой же проблемой, разница в том, что текстовый узел имеет размер 53 МБ, а не 3 МБ (плюс, он содержит астральные символы, плюс он обрабатывается с помощью fn:replace() перед выводом). Какой процессор XSLT вы используете? В последних выпусках Saxon есть оптимизация, при которой xsl:value-of может передавать текст непосредственно сериализатору, но это очень сильно зависит от деталей выполняемой вами обработки.   -  person Michael Kay    schedule 22.12.2020
comment
Спасибо Эйрик - да, к сожалению, только v1.0.   -  person devranred    schedule 22.12.2020
comment
Спасибо за комментарий, Майкл, я хотел протестировать сегодня днем ​​и проверить процессор и т. Д. (Я думаю, это SaxonEE). Меня ограничивает тот факт, что я просто создаю шаблоны XSLT в этом стороннем приложении, которое получает xml-файлы из других систем. Я продолжу искать лучшие варианты, пока работаю, и вернусь к этому, если что-нибудь найду. Приятно знать, что я не единственный, у кого есть проблема. Не уверен, что 10G поможет вам с размером вашего файла! - Удачи   -  person devranred    schedule 22.12.2020


Ответы (1)


Не нашел желаемого XSLT-решения и нуждался в рабочем процессе довольно быстро. Добавление памяти решило это для меня. Увеличено пространство кучи Xmx до 10G в качестве обходного пути на случай нечетного времени, когда это происходит.

person devranred    schedule 22.12.2020