Как сохранить специальные символы после трансформации?

Я работаю над преобразованием XML с использованием XSL в программе Java. Это образец XML

<root>
 <head>Heading goes here</head>
 <middle>Some text goes here</middle>
 <body>Body goes here &#x2019; with special characters</body>
</root>

В XSL есть шаблон идентификации, и он просто удаляет элемент <middle>.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
  <!-- the identity template -->
  <xsl:template match="@* | node()" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

<!-- template to remove middle element -->

</xsl:stylesheet>

Преобразование выполняется с помощью программы Java (класс Transformer). После преобразования &#x2019;в теле преобразуется в ’ char. Я хочу сохранить &#x2019; вместо ’ char. Пожалуйста, дайте мне знать, как этого добиться?

Заранее спасибо.


person emeh    schedule 13.01.2015    source источник
comment
Короче говоря, измените класс Transformer так, чтобы он сохранил &#x2019;, если вы хотите получить развернутый ответ, нам понадобится соответствующий код класса Transformer.   -  person Jonny Henly    schedule 13.01.2015
comment
Существуют и другие специальные символы, такие как ’ . Некоторые из них я не знал. Как сохранить все символы?   -  person emeh    schedule 13.01.2015
comment
Не могли бы вы показать XSLT, который вы сейчас используете? Кроме того, можете ли вы сказать, используете ли вы XSLT 1.0 или XSLT 2.0? Спасибо!   -  person Tim C    schedule 13.01.2015
comment
@TimC Я добавил XSLT в вопрос.   -  person emeh    schedule 13.01.2015


Ответы (2)


Обычно преобразователь выводит символы как литералы, если они не могут быть представлены в выбранной выходной кодировке. Если вы хотите сохранить символы, отличные от ASCII, в качестве ссылок на символы, скажите вашей таблице стилей использовать US-ASCII в качестве выходной кодировки:

<xsl:output method="xml" encoding="US-ASCII" omit-xml-declaration="yes"/>

и теперь все символы, отличные от ASCII, должны быть сериализованы как ссылки.

Это не обязательно сохранит входной байт для байта, например, сериализатор может выбрать использование десятичных ссылок, а не шестнадцатеричных.

person Ian Roberts    schedule 13.01.2015

Поскольку XSLT работает с деревом, содержащим все символы как символы Unicode, независимо от исходного лексического представления, чистый XSLT-процессор не может сохранить представление символа, скопированного из ввода в вывод. Вам нужно будет использовать препроцессор, такой как LexEv http://andrewjwelch.com/lexev/, чтобы сначала преобразовать представления символов в разметку, с которой ваш XSLT может работать, преобразовывать или сохранять.

person Martin Honnen    schedule 13.01.2015