Как я могу использовать объекты символов HTML внутри EL в JSF?

Я хочу использовать длинный тире в атрибуте значения для компонента h:link.

Вот моя попытка (в настоящее время не работает):

<h:link value="#{somethingHere} &mdash; #{anotherHere}">
    <f:param name="identifier" value="#{somethingHere.identifier}" />
</h:link>

Это приводит к FaceletsException:

FaceletException: Error Parsing /index.xhtml: Error Traced[line: 13]
                The entity "mdash" was referenced, but not declared.
at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:394)
...

Я знаю, что вместо этого могу использовать привязку HTML, но есть ли способ сделать это внутри языка выражений? (EL) выражение? Каков правильный способ сделать это?


person Elias Dorneles    schedule 16.08.2012    source источник


Ответы (1)


Facelets основан на XML и обрабатывается синтаксическим анализатором XML. &mdash; является сущностью HTML и не распознается в XML. Только пять из перечисленных на этой странице Википедии, &quot;, &amp;, &apos;, &lt; и &gt;, распознаются в XML.

Facelets/XML по умолчанию уже использует UTF-8, а объекты HTML в основном являются пережитком эпохи до UTF-8 и не нужны в документах UTF-8, поэтому вы можете просто поместить фактический символ в виде простого/незакодированного в шаблон (при условии что редактор может сохранить файл как UTF-8).

Другими словами, просто настроить

<h:link value="#{somethingHere} &mdash; #{anotherHere}">

to

<h:link value="#{somethingHere} — #{anotherHere}">

Если по какой-то причине это невозможно, то вы можете вместо этого использовать числовую ссылку на символ в формате &#nnnn;, подобно тому, как можно было бы использовать &#160; для представления &nbsp; в XML. Ссылку на числовой символ можно найти на fileformat.info: Символ Unicode 'EM DASH ' (U+2014)

Кодировки

Объект HTML (десятичный) &#8212;

Итак, это должно сделать для вас:

<h:link value="#{somethingHere} &#8212; #{anotherHere}">

Альтернативой, которая должна больше соответствовать точному сообщению об ошибке, является явное объявление ссылки на сущность в типе документа.

<!DOCTYPE html [
    <!ENTITY mdash "&#8212;"> 
]>

Но это не общая рекомендация/подход, поскольку вам нужно будет повторять это для каждого отдельного XML-файла, в котором используется символ.

person BalusC    schedule 16.08.2012
comment
Не могли бы вы рассказать о том, почему не рекомендуется объявление сущности в типе документа? - person Elias Dorneles; 16.08.2012
comment
Его явно необходимо поместить в каждый отдельный XML-шаблон с использованием этого символа, вы не можете просто поместить его в основной шаблон или около того. Лично я бы просто поместил символ в шаблон в виде простого/незакодированного. Если это не удается для вас (Mojibake и т. д.), возможно, вам потребуется перенастроить свой редактор для сохранения файлов в формате UTF-8. Facelets уже по умолчанию использует UTF-8 для разбора/обслуживания файлов XML. - person BalusC; 16.08.2012
comment
Понял, еще раз спасибо! Я буду использовать числовую ссылку, чтобы предотвратить Mojibake для других разработчиков. - person Elias Dorneles; 16.08.2012