0

jsp ファイル内の 2 つの文字列の値を比較しようとしています。これらの文字列にはどちらもアポストロフィが含まれています'。これらの文字列は、さまざまなソースからのものです。

次のように 2 つの文字列を直接比較すると、次のようになります。

<c:if test="${ fn:toLowerCase(colorInfo.value.name) eq fn:toLowerCase(colorName) }">
    hello!
</c:if>

比較は false を返します。ただし、2 つの値を出力すると、

マイクズ・グリーン

マイクズ・グリーン

前のステップで、これらの文字列はトリミングされますが、これは空白の問題ではありません。何らかの理由で、変数として格納される場合、これら 2 つのうちの 1 つが xml でエスケープされたアポストロフィとともに格納されます。

&#39;

これを証明するために、比較を次のように変更しました。

<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), '&#39;', apostrophe) 
    eq 
    fn:replace(fn:toLowerCase(colorName), '&#39;', apostrophe) 
}">
    hello!
</c:if>

この比較は true を返します。したがって、2 つの文字列の 1 つには、保存中にアポストロフィのリテラル xml エスケープ バージョンがあります。

保存されたjsp変数内のxml文字列をエスケープするより効率的な方法はありますか? これは比較を行う非常に醜い方法であり、将来の文字列に不適切にエスケープされている他の文字が含まれている場合、このロジックにさらにコードを追加する必要があるため、簡単には拡張できません。

4

0 に答える 0