Как вставить & NBSP; в XSLT

207

Как я могу вставить

 

В таблицу стилей XSLT я продолжаю получать эту ошибку:

Ошибка синтаксического анализа XML: неопределенная сущность

По сути, я хочу, чтобы в шаблоне XSLT был символ пробела.

JL.
источник
2
Вы также можете использовать & # xA0; то же самое для & # 160; смотрите здесь stackoverflow.com/questions/7511214/...
user3766111

Ответы:

337

Используйте код объекта  Вместо этого .

 это HTML "ссылка на символьную сущность". Именованная сущность для неразрывного пробела в XML отсутствует, поэтому вы используете код  .

В Википедии есть список сущностей XML и HTML , и вы можете видеть, что в XML есть только 5 «предопределенных сущностей», но в HTML их более 200. Я также укажу на Создание пробела (& nbsp;) в XSL, который имеет отличные ответы.

brabster
источник
3
Недавно мы столкнулись с ситуацией, когда только один из многих XSL перестал работать с этой техникой и начал показывать странный символ. Однако, если я использую технику CDATA от WaterSoul, это сработает.
@BrianReindel, это, вероятно, означает, что вы использовали неправильную цифровую ссылку на сущность, т.е. Šвместо  последней, которая всегда будет преобразовываться в неразрывный пробел Unicode.
Авель
Ссылка Top Ten Java и XSLT Tips действительно полезна.
ЖЖ
<xsl: text> & # 160; </ xsl: text> он
разделяет
1
Ссылка прогнила.
GSerg
37

&#160;работает действительно хорошо. Тем не менее, он будет отображать один из этих странных символов в кодировке ANSI. <xsl:text>работал лучше для меня.

<xsl:text> </xsl:text>
Saroj
источник
3
Используя принятый ответ, я получил пробел в своем выводе XML (по крайней мере, так это выглядело в XML-редакторе VS2010). Используя этот ответ, я получаю ровно 1 пробел.
Mathijs Flietstra
1
@Matthijs, это пробел, а не неразрывный пробел, что не одно и то же. Если VS показывает это неправильно, проверьте свою кодировку (VS вполне способен показать это правильно, и он должен быть независимым от кодировки, так что, скорее всего, вы делали что-то другое неправильно).
Авель
25

Можно также сделать это:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
WaterSoul
источник
2
Это будет работать, если процессор поддерживаетdisable-output-escaping , что ему не требуется, и было объявлено устаревшим в XSLT 2.0 и особенно в 3.0. В этих версиях вы можете xsl:character-mapдобиться того же эффекта с гарантированно работающим кросс-процессором. Кроме того, это помещает именованную сущность &nbsp;в вывод, который не обязательно совпадает с неразрывным пробелом, и принимающая сторона должна объявить эту сущность (в HTML это обычно неявно).
Авель
21

Использовать это

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

edit: Downvoters, вероятно, должны проверить, что это работает в первую очередь (это работает, и является наиболее общим решением проблемы).

jagprinderdeep
источник
1
Не уверен, но я проверил свой подход, и он работает, поэтому я не уверен, для чего был понижен :(
jagprinderdeep
2
Кроме того, принятый ответ не будет действителен для всех парсеров в соответствии со связанной страницей; просто один на один
jagprinderdeep
1
Я уже объяснил причину моего отрицательного ответа, но если бы я понизил этот ответ, то причина была бы - он отвечает на неправильный вопрос. ОП четко спросил, как поставить неразрывное пространство, используя xslt, а вы ответили, как поставить последовательность амперсанд-nbsp-точка с запятой. И ссориться из-за отрицательных голосов тоже неприятно. А если серьезно, ты никогда не говорил такого о CDATA?
Майкл Крелин - хакер
1
Хорошо, jagprinderdeep, я отозвал свое отрицательное голосование, но взамен, пожалуйста, навестите меня, как только я попал в психиатрическую больницу. (обратите внимание, что я не верну вам отрицательный ответ по этой новой причине). Но понимаю, что вы отвечаете не на тот вопрос. Я думаю, что это было причиной других отрицательных голосов.
Майкл Крелин - хакер
8
Я также понизил голосование, поскольку вы не можете гарантировать, что принимающая сторона объявит & nbsp ;. Если вы работаете с xslt + html, то да, это способ сделать это, хотя и взломать. Но если вы используете xslt для генерации другого xml, то он просто взорвется.
Дуг
14

Возможно, вы захотите добавить определение для этой сущности в начале файла (ниже декларации xml):

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

Также вы можете добавить больше объектов, таких как Ntilde, Aacute и т. Д.

Виктор Гюго
источник
5

В дополнение к ответу Виктора Гюго можно получить все допустимые ссылки на символы в файле XSLT, например:

<!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>&amp; &nbsp; &ndash;</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 ... для загрузки патча и комментариев.

Сергей Ушаков
источник
1
Обратите внимание, что в последнее время W3 начал блокировать слишком много запросов к этим и аналогичным ссылкам, если они исходят от автоматизированного процесса. Поместите этот файл локально или на свой сервер и измените URL соответствующим образом, и все будет в порядке. Кроме этого +1 и отличное решение для использования именованных сущностей HTML.
Авель
Хорошая заметка, и есть еще одна причина иметь локальную копию файла с определениями сущностей, так как в противном случае процесс XSLT может завершиться сбоем, если интернет-соединение недоступно. В мире Java нет необходимости взламывать URL-адреса, так как можно организовать EntityResolver , и Apache XML Commons Resolver может быть хорошим кандидатом. Другие программные платформы, вероятно, тоже будут иметь подобные методы ...
Сергей Ушаков
Да, для справки, для dotnetters: абстрактный метод ResolveEntity для сущностей и XmlResolver для загрузки внешних ресурсов , которые являются эквивалентами .NET для этих методов Java .
Авель
2

При использовании следующего (без disable-output-escaping!) Вы получите один неразрывный пробел:

<xsl:text>&#160;</xsl:text>

Shaam
источник
4
Вам не нужно disable-output-escapingдля этого
Ян Робертс
2

Таблицы стилей XSLT должны быть правильно сформированными в формате XML. Поскольку "&nbsp;"это не одна из пяти предопределенных сущностей XML , она не может быть напрямую включена в таблицу стилей. Поэтому возвращение к вашему решению "&#160;"является идеальной заменой"&nbsp;" вы должны использовать.

Пример:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>
Адиль
источник
0

Вы также можете использовать:

<xsl:value-of select="'&amp;nbsp'"/>

запомните усилитель после & или вы получите сообщение об ошибке

Маттиа Вио
источник
Это выдаст &amp;nbsp;(предполагая, что вы намерены использовать точку с запятой), который будет отображаться как &nbsp;, а не как `` (nb-space).
Авель
0

Я пытался отобразить границы для пустой ячейки в таблице HTML. Мой старый трюк с использованием неразрывного пробела в пустых ячейках не работал с xslt. Я использовал разрыв строки с тем же эффектом. Я упоминаю об этом на всякий случай, потому что вы пытались использовать неразрывный пробел, чтобы дать некоторый контент «пустой» ячейке таблицы, чтобы включить границы ячейки.

<br/>
BH
источник
У меня похожий сценарий, и похоже, что он работает для получения ячеек таблицы.
Ричард Мур
0

Попробуй использовать

<xsl:text>&#160;</xsl:text>

Но это зависит от используемого вами процессора XSLT: спецификация XSLT не требует, чтобы процессоры XSLT преобразовывали его в " &nbsp;".

Viacheslav
источник
0

Хотя ответ уже был предоставлен @brabster и другими.
Я думаю, что более многократное решение будет:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Леонид Дашко
источник