jsp ファイル内の 2 つの文字列の値を比較しようとしています。これらの文字列にはどちらもアポストロフィが含まれています'
。これらの文字列は、さまざまなソースからのものです。
次のように 2 つの文字列を直接比較すると、次のようになります。
<c:if test="${ fn:toLowerCase(colorInfo.value.name) eq fn:toLowerCase(colorName) }">
hello!
</c:if>
比較は false を返します。ただし、2 つの値を出力すると、
マイクズ・グリーン
マイクズ・グリーン
前のステップで、これらの文字列はトリミングされますが、これは空白の問題ではありません。何らかの理由で、変数として格納される場合、これら 2 つのうちの 1 つが xml でエスケープされたアポストロフィとともに格納されます。
'
これを証明するために、比較を次のように変更しました。
<c:set var="apostrophe" value="'" />
<%-- I'm multilining this purely for readability on SO, it's 1 line in the code --%>
<c:if test="${
fn:replace(fn:toLowerCase(colorInfo.value.name), ''', apostrophe)
eq
fn:replace(fn:toLowerCase(colorName), ''', apostrophe)
}">
hello!
</c:if>
この比較は true を返します。したがって、2 つの文字列の 1 つには、保存中にアポストロフィのリテラル xml エスケープ バージョンがあります。
保存されたjsp変数内のxml文字列をエスケープするより効率的な方法はありますか? これは比較を行う非常に醜い方法であり、将来の文字列に不適切にエスケープされている他の文字が含まれている場合、このロジックにさらにコードを追加する必要があるため、簡単には拡張できません。