Оставьте объект без изменений в XML + XSLT - PullRequest
3 голосов
/ 28 апреля 2010

Я преобразую XML в (вроде) HTML с помощью таблиц стилей XSL (используя Apache Xalan). В XML могут быть такие объекты, как —, которые должны быть оставлены как есть. В начале файла XML у меня есть тип документа, который ссылается на эти объекты. Что я должен сделать, чтобы сущность осталась без изменений?

<!DOCTYPE article [
<!ENTITY mdash "&mdash;"><!-- em dash -->
]>

дает мне SAXParseException: Recursive entity expansion, 'mdash' при обнаружении &mdash в тексте XML.

Ответы [ 2 ]

4 голосов
/ 28 апреля 2010

Способ определения и использования объекта: :

<!DOCTYPE xsl:stylesheet [<!ENTITY mdash "&#x2014;">]>
<t>Hello &mdash; World!</t>

При обработке с самой простой из возможных таблиц стилей XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
</xsl:stylesheet>

Получается правильный вывод (содержащий mdash):

Hello — World!

Важно

В XSLT 2.0 можно использовать инструкцию <xsl:character-map> , чтобы определенные указанные символы были представлены объектами. В данном конкретном случае:

<xsl:stylesheet   version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output omit-xml-declaration="yes" 
    use-character-maps="mdash"/>
  <xsl:character-map name="mdash">
    <xsl:output-character character="&#x2014;" string="&amp;mdash;" />
  </xsl:character-map>

</xsl:stylesheet>

когда вышеупомянутое преобразование применяется к тому же XML-документу (уже показан выше), вывод:

Hello &mdash; World!
1 голос
/ 28 апреля 2010

Что я должен сделать, чтобы сущность осталась неизменной?

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

Однако, если вы установите <xsl:output encoding="us-ascii">, документ после обработки должен быть сериализован в набор символов ASCII, и, таким образом, штрих-код em должен быть закодирован в &#8212;.

XSLT 2.0 предлагает «карты символов», которые позволят вам указать, что все символы должны быть закодированы в &mdash; или любой другой последовательности, но он не может различить , который изначально был в источнике и тот, который был &mdash;. Если у вас нет XSLT 2.0, вы всегда можете попробовать взломать простую строку в выходном документе, чтобы заменить на &mdash;. Это хитроумно, но все в порядке, если вы знаете, что будет использоваться только для текста и значений атрибутов.

Условие «должен быть оставлен как есть» обычно довольно сомнительно. Это действительно плохой анализатор HTML, который не может принимать простые символы Unicode, или в худшем случае, когда теряется информация о кодировке, он должен по крайней мере справиться с числовой ссылкой на символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...