これまでに投稿されたすべての回答は正しい解決策を示していますが、具体的な問題の根本的な原因を適切に説明できる回答はありませんでした。
Faceletsは、XHTML + XMLを使用してHTML出力を生成するXMLベースのビューテクノロジです。XMLには、XMLパーサーによって特別に扱われる5つの特殊文字があります。
<
タグの始まり。
>
タグの終わり。
"
属性値の開始と終了。
'
属性値の代替の開始と終了。
&
エンティティの開始(で終わる;
)。
以下の場合に&
続いされていない#
(例えば 
、 
など)、XMLパーサーは、暗黙のうちに5人の1を探している定義済みのエンティティ名 lt
、gt
、amp
、quot
およびapos
、または任意の手動で定義されたエンティティ名。ただし、特定のケースでは&
、XMLエンティティとしてではなく、JavaScript演算子として使用していました。これは、発生したXML解析エラーを完全に説明しています。
エンティティ名は、エンティティ参照の「&」の直後に続く必要があります
本質的に、JavaScriptコードを間違った場所、つまりJSファイルではなくXMLドキュメントに記述しているため、それに応じてすべてのXML特殊文字をエスケープする必要があります。&
以下のようにエスケープする必要があります&
。
だから、あなたの特定のケースでは、
if (Modernizr.canvas && Modernizr.localstorage &&
になる必要があります
if (Modernizr.canvas && Modernizr.localstorage &&
XMLで有効にします。
ただし、これにより、JavaScriptコードの読み取りと保守が困難になります。Mozilla Developer Networkの優れたドキュメント「XHTML用のJavaScriptの記述」で述べられているように、JavaScriptコードを文字データ(CDATA)ブロックに配置する必要があります。したがって、JSFの用語では、次のようになります。
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
XMLパーサーは、ブロックの内容をXMLではなく「プレーンバニラ」文字データとして解釈するため、XML特殊文字を「現状のまま」解釈します。
ただし、JSコードを独自のJSファイルに配置することをお勧めします。このファイルに<script src>
は、、またはJSF用語で<h:outputScript>
。を含めます。
<h:outputScript name="onload.js" target="body" />
(target="body"
;このようにすると、JSFは、それ自体がどこにあるかに関係なく、の<script>
最後に自動的にレンダリングします。これにより<body>
、および;と<h:outputScript>
同じ効果が得られるため、そのスクリプトでこれらを使用する必要はありません)window.onload
$(document).ready()
これにより、JSコードのXML特殊文字について心配する必要がなくなります。追加のボーナスとして、これにより、ブラウザーにJSファイルをキャッシュさせて、合計応答サイズを小さくすることができます。
参照: