Использование объекта HTML в XSLT (например, & nbsp;)

Как лучше всего включить html-объект в XSLT?

<xsl:template match = "/a/node">
    <xsl:value-of select = "."/>
    <xsl:text>&nbsp;</xsl:text>
</xsl:template>

этот возвращает XsltParseError

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
63
0
61 856
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Вы можете использовать раздел CDATA

<xsl:text disable-output-escaping = "yes"><![CDATA[&nbsp;]]></xsl:text>

или вы можете описать & nbsp в местном DTD:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

или просто используйте &#160; вместо &nbsp;

this one returns a XsltParseError

Да, и причина этого в том, что &nbsp; не является предопределенным объектом в XML или XSLT, как в HTML.

Вы можете просто использовать символ Юникода, который обозначает &nbsp;: &#160;

Еще одна возможность использовать html-сущности из xslt:

<xsl:text disable-output-escaping = "yes">&amp;nbsp;</xsl:text>

Символ юникода давал вопросительные знаки и поля, вывод неэкранированного html-объекта работал у меня, спасибо.

AUSteve 16.08.2011 06:23

XSLT по умолчанию обрабатывает только пять основных сущностей: lt, gt, apos, quot и amp. Все остальные должны быть определены как @Aku упоминается.

Теперь, когда есть Unicode, использование именованных символьных сущностей, как правило, контрпродуктивно. Я бы рекомендовал использовать символ Unicode для неразрывного пробела вместо сущности только по этой причине. В качестве альтернативы вы можете использовать объект &#160; вместо именованного объекта. Использование именованных сущностей делает ваш XML зависимым от встроенного или внешнего DTD.

Одного пробела между текстовыми тегами должно быть достаточно.

Также можно расширить подход из 2-й части Аку ответ и получить все известные ссылки на символы, например:

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&nbsp;&minus;30&deg;</xsl:text>

Есть определенная разница в результате по сравнению с подходом <xsl:text disable-output-escaping = "yes">. Последний будет создавать строковые литералы, такие как &nbsp;, для всех видов вывода, даже для <xsl:output method = "text">, и это может отличаться от того, что вы могли бы пожелать ... Напротив, получение сущностей, определенных для шаблона XSLT через <!DOCTYPE ... <!ENTITY ..., всегда будет производить вывод в соответствии с вашими настройками xsl:output.

Тогда может быть разумным использовать локальный преобразователь сущностей, чтобы механизм XSLT не извлекал определения символьных сущностей из Интернета. Пользователи JAXP или явного Xalan-J могут нуждаться в патче для Xalan-J, чтобы правильно использовать преобразователь. Смотрите мой блог XSLT, сущности, Java, Xalan ... для загрузки патча и комментариев.

Это красиво - желаю, чтобы это было более известным

IcedDante 27.05.2016 01:46

Спасибо за информацию. Я написал короткое сообщение в блоге о том, что сработало для меня, когда я выполнял преобразование XSLT в шаблоне Dynamicweb CMS.

Сообщение в блоге находится здесь: Как добавлять сущности в шаблоны XSLT.

/ Стен Хугард

Я обнаружил, что все эти решения создают символ Â на пустом месте.

Использование <xsl:text> </xsl:text> решило проблему для меня; но <xsl:text>#x20;</xsl:text> тоже может работать.

Необходимо использовать сущность # x160;

Это нет x160, но десятичное 160.

laszlok 27.03.2013 13:10

Мне не повезло с подходом DOCTYPE от Aku.

То, что сработало для меня в преобразованиях MSXML на сервере Windows 2003, было

    <xsl:text disable-output-escaping = "yes">&amp;#160;</xsl:text>

Этакий гибрид вышеперечисленного. Спасибо участникам Stackoverflow!

Другие вопросы по теме