I want to use the em dash in a value attribute for an h:link
component.
Here is my attempt (currently not working):
<h:link value="#{somethingHere} — #{anotherHere}">
<f:param name="identifier" value="#{somethingHere.identifier}" />
</h:link>
This results in a 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)
...
I know I can use an HTML anchor instead, but is there a way to do it inside an Expression Language (EL) expression? What is the correct way to do this?
Facelets is XML based and processed by a XML parser. The —
is a HTML entity and not recognized in XML. Only the five listed in this Wikipedia page, "
, &
, '
, <
and >
, are recognized in XML.
Facelets/XML uses by default already UTF-8, and HTML entities are basically a leftover of pre-UTF-8 era and not necessary in UTF-8 documents, so you could just put the actual character plain/unencoded in the template (provided that the editor is able to save the file as UTF-8).
In other words, simply adjust
<h:link value="#{somethingHere} — #{anotherHere}">
to
<h:link value="#{somethingHere} — #{anotherHere}">
If this isn't an option for some reason, then you could instead use a numeric character reference in the format &#nnnn;
, like as one would use  
to represent a
in XML. You can find the numeric character reference in fileformat.info: Unicode Character 'EM DASH' (U+2014)
Encodings
HTML Entity (decimal)
—
So, this should do for you:
<h:link value="#{somethingHere} — #{anotherHere}">
An alternative, which should satisfy the exact error message more, is to declare the entity reference explicitly yourself in the doctype.
<!DOCTYPE html [
<!ENTITY mdash "—">
]>
But this isn't the general recommendation/approach as you'd need to repeat this over every single XML file wherein the character is been used.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With