如何在JSF中使用EL内部的HTML字符实体?

时间:2012-08-16 17:45:49

标签: jsf-2 facelets

我想在h:link组件的值属性中使用em dash

这是我的尝试(当前不起作用):

<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表达式中执行此操作?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

Facelets是基于XML的,由XML解析器处理。 &mdash;是HTML实体,无法在XML中识别。只有this Wikipedia page&quot;&amp;&apos;&lt;&gt;中列出的五个才能在XML中识别。

Facelets / XML默认使用UTF-8,因此你可以在模板中放置实际字符plain / unncoded(前提是编辑器能够将文件保存为UTF-8)。

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

如果出于某种原因这不是一个选项,那么您可以使用&#nnnn;格式的数字字符引用,就像使用&#160;来表示&nbsp;一样在XML中。您可以在fileformat.info中找到数字字符引用:Unicode Character 'EM DASH' (U+2014)

  

编码

     

HTML实体(十进制)&#8212;

所以,这应该适合你:

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

另一个应该更准确地满足确切错误消息的替代方法是在doctype中明确地声明实体引用。

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

但这不是一般性建议/方法,因为您需要在每个使用该字符的XML文件上重复此操作。