XSLT в Java: разделение раздела CDATA

Я хочу заменить некоторые элементы в огромном файле XML, и я подумал, что сделаю это с помощью XSLT. У меня нет абсолютно никакого опыта в этом, поэтому, если вы думаете, что есть лучшие способы сделать это, пожалуйста, скажите мне.

Во всяком случае, в качестве первого шага я просто хотел скопировать весь XML. Это мой xsl-файл:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="no" cdata-section-elements="script"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Соответствующий код Java:

Source xmlInput = new StreamSource(oldProjectStream);
Source xsl = new StreamSource("test.xsl");

Transformer transformer = TransformerFactory.newInstance().newTransformer(xsl);
StreamResult xmlOutput = new StreamResult("output/project.xml");
transformer.transform(xmlInput, xmlOutput);

Большая часть вывода в порядке, также порядок элементов не изменился (это может оказаться очень важным).

XML содержит некоторый код Lua в разделах CDATA. Однако в некоторых (кажущихся случайными) точках раздел CDATA закрывается и снова открывается. Кажется, это связано со скобками в коде, но в меру - в 1,4-мегабайтном XML-коде около 5 точек, выглядящих так:

<script><![CDATA[
...
html_encoding["Otilde"  ] = string.char(213)
html_encoding["Ouml"    ]]]><![CDATA[ = string.char(214)
html_encoding["Oslash"  ] = string.char(216)
...
]]></script>

В исходном файле средняя строка выглядит так же, как и остальные. Есть тысячи строк, где я поставил точки. Что тут происходит?

(Проприетарное) приложение, которое должно обрабатывать XML, не может его загрузить.


person user2727133    schedule 10.09.2013    source источник
comment
StackTrace может быть полезен.   -  person AlexR    schedule 10.09.2013
comment
Попробуйте удалить cdata-section-elements. CDATA — это удобная функция, которая совершенно не нужна в XML. Если ваше проприетарное целевое приложение вообще может обрабатывать XML, оно будет работать. Опять же, если ваше проприетарное целевое приложение вообще может обрабатывать XML, оно уже должно работать.   -  person Tomalak    schedule 10.09.2013
comment
@Tomalak Почему это должно быть ненужным? ‹ и › не допускаются в качестве содержимого в XML, но код может их содержать.   -  person user2727133    schedule 10.09.2013
comment
Да, но < и > легко кодируются как &lt; и &gt; в XML, так что это вовсе не ограничение.   -  person Tomalak    schedule 10.09.2013
comment
Мне не разрешено изменять содержимое этих разделов, поэтому я не думаю, что это вариант.   -  person user2727133    schedule 11.09.2013
comment
У меня тоже эта проблема. При отладке я вижу, что CDATA закрывается и снова открывается при каждом разрыве строки, но иногда это делается и в середине текста. Это может сломать материал, когда этот текст должен быть обработан кодом. Я понятия не имею, в чем причина такого поведения, и пока ничего не нашел в Интернете. @user2727133 user2727133 ты нашел виновника?   -  person nonzaprej    schedule 15.10.2020
comment
@nonzaprej Нет. В любом случае задача оказалась слишком сложной для обработки XSLT, поэтому я просто работал с документом, созданным SAXBuilder напрямую.   -  person user2727133    schedule 17.10.2020
comment
Ну, в моем случае неисправный xml выходит из SAXReader, так что еще до его обработки с помощью xsl. Мне придется найти обходной путь.   -  person nonzaprej    schedule 19.10.2020


Ответы (1)


Полезно сообщить нам, какой процессор XSLT вы используете.

Сериализатор должен закрыть и снова открыть раздел CDATA, если он встречает "]]>" в данных, потому что эта последовательность не может по закону появиться в разделе CDATA. Это не должно делаться ни при каких других обстоятельствах, хотя спецификация, вероятно, не запрещает это.

person Michael Kay    schedule 10.09.2013