Spring и XSLT, кодировка символов - PullRequest
2 голосов
/ 10 февраля 2011

У меня проблема с правильной кодировкой части представления HTML. Файл XSL в файлах JSP генерирует .html. Значения из базы данных закодированы правильно, но статические заголовки таблицы содержат неправильные символы.

Например, есть заголовки с именем: Imię, Nazwisko, Hasło, Płeć, но он генерирует: Imi ™, Nazwisko, Hasāo, Pée ‡

Мой шаблон forHomeHtml.xml:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"
version="1.0">

<xsl:output method="xhtml" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="/employees">
    <table>
        <tr>
            <th></th>
            <th>Imię</th>
            <th>Nazwisko</th>
            <th>Hasło</th>
            <th>Płeć</th>
        </tr>
        <xsl:for-each select="./employee">
            <tr>
                <td></td>
                <td>
                    <xsl:value-of select="name/text()" />
                </td>
                <td>
                    <xsl:value-of select="surname/text()" />
                </td>
                <td>
                    <xsl:value-of select="password/text()" />
                </td>
                <td>
                    <xsl:value-of select="gender/text()" />
                </td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

Сайт JSP:

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:import var="inputDocument"
url="http://localhost:8080/xyz/home.xml" />
<c:import var="stylesheet" url="/WEB-INF/xsl/forHomeHtml.xsl" />

<x:transform xml="${inputDocument}" xslt="${stylesheet}">
</x:transform>

Я использую Tiles, поэтому кодировка объявлена ​​в основном шаблоне:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title><tiles:getAsString name="title" /></title>
...

Добавлю, что у меня есть фильтр кодировки в web.xml

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Кодировка символов файлов (JSP, XSL, XML и т. Д.) Установлена ​​в UTF-8. Кодировка символов браузера установлена ​​в UTF-8.

Кто-нибудь знает причину этой проблемы?


Обновление : Странно, но источник сайта содержит следующий код:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-    transitional.dtd">
<html>
<head>
<title>Strona główna</title>
<style type="text/css">
.table-list {
border: 1px solid black;
border-collapse: collapse;
}
...
</style>
</head>
<body>
<table width="100%" border="0">
<tr style="background-color: #EEEEEE;">
<td><?xml version="1.0" encoding="UTF-8" ?>
<ul class="navigation_menu">
<li><a href="./home.htm">Strona główna</a></li>
<li><a href="./rejestracja.htm">Rejestracja</a></li>
<li><a href="./historia-wypozyczen-samochodu.htm">Historia samochodu</a></li>
<li><a href="./dodawanie-zamowienia.htm">Dodawanie zamówienia</a></li>
</ul>

<div style="text-align: center;">
Liczba obsłużonych dzisiaj zamówień:
0
</div></td></tr>
<tr>
<td valign="top" align="left">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE table PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-    transitional.dtd">
<table xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<tr>
<th />
<th>ImiÄ&#153;</th>
<th>Nazwisko</th>
<th>HasÅ&#130;o</th>
<th>PÅ&#130;eÄ&#135;</th>
</tr>
<tr>
<td />
<td>Zenon</td>
<td>Kowalski</td>
<td>zHasło</td>
<td>Mężczyzna</td>
</tr>
<tr>
<td /></tr>
....
<tr style="background-color: #EEEEEE;">
<td><?xml version="1.0" encoding="UTF-8" ?>
<div style="text-align: center;"></div></td></tr>
</table>
</body>
</html>

Нет заголовка с типом контента!

Должен ли я изменить свой шаблон плиток?

Кстати, @Alejandro, @Jim Garrison - спасибо за советы.

1 Ответ

1 голос
/ 10 февраля 2011

Кажется, что JSTL либо не читает, либо выводит данные UTF-8 правильно. Я нашел несколько сообщений о проблемах с данными UTF-8 и преобразованиями JSTL, но не так много решений.

Я нашел эту страницу, описывающую подобную проблему с поддержкой JSTL и UTF-8 . Решением было переключить трансформаторы и использовать Saxon.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...