XSLT не может трансформироваться, если есть немецкий символ - PullRequest
3 голосов
/ 22 июня 2011

Я работаю с версией 1.0 XSLT и у меня проблема с немецкими символами.Если в данных элемента XML есть какой-либо немецкий символ, XSLT не может ничего преобразовать, и выходные данные полностью пусты.

Краткий пример:

<root>
  <table name="users">
   <row>
     <field attr1="name">GÜNTER</field>
   </row>
  </table>
</root>

Выходные данные должны быть:

<users>
  <name>GUENTER</name>
</users>

Я использую кодировку utf-8 в XSL, и она может быть преобразована при использовании Eclipse.В моем приложении эти XSL-файлы хранятся в базе данных Oracle и кэшируются при запуске приложения.Но мое Java-приложение не может преобразовать это и выдает эту ошибку:

Неверный байт 2 из 2-байтовой последовательности UTF-8

Вот основной XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:include href="functions.xsl" />
    <xsl:output encoding="utf-8" method="xml" indent="yes" />
    <xsl:template match="/">
        <users>
            <name>
                <xsl:call-template name="replaceCH">
                    <xsl:with-param name="value" select="//root/table[@name='users']/row/field[@attr1='name']"/>
                </xsl:call-template>
            </name>
        </users>    
    </xsl:template>
</xsl:stylesheet>

Вот функции.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="replace">
    <xsl:param name="text"/>
    <xsl:param name="search"/>
    <xsl:param name="replace"/>
    <xsl:choose>
        <xsl:when test="contains($text, $search)">
            <xsl:variable name="replace-next">
                <xsl:call-template name="replace">
                    <xsl:with-param name="text" select="substring-after($text, $search)"/>
                    <xsl:with-param name="search" select="$search"/>
                    <xsl:with-param name="replace" select="$replace"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="concat(substring-before($text, $search),$replace,$replace-next)"/>
        </xsl:when>
        <xsl:otherwise><xsl:value-of select="$text"/></xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="replaceCH">
    <xsl:param name="value"/>
        <xsl:variable name="temp">
        <xsl:call-template name="replace">
            <xsl:with-param name="text" select="$value"/>
            <xsl:with-param name="search" select="'_'"/>
            <xsl:with-param name="replace" select="''"/>
        </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="temp1">
            <xsl:call-template name="replace">
                <xsl:with-param name="text" select="$temp"/>
                <xsl:with-param name="search" select="'Ö'"/>
                <xsl:with-param name="replace" select="'OE'"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="temp2">
            <xsl:call-template name="replace">
                <xsl:with-param name="text" select="$temp1"/>
                <xsl:with-param name="search" select="'Ü'"/>
                <xsl:with-param name="replace" select="'UE'"/>
            </xsl:call-template>
        </xsl:variable> 
        <xsl:value-of select="$temp2"/>     
    </xsl:template>
</xsl:stylesheet>

Когда я сохраняю XSL в БД, Ö и Ü выглядят как Ã?:

<xsl:with-param name="search" select="'Ã?'"/>

Я используюСпящий режим и настроил кодировку, как показано ниже:

hibernate.connection.characterEncoding = utf-8

Как я могу решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Ваш источник XML обрабатывается анализатором XML как в UTF-8, но не в UTF-8, а в какой-то другой кодировке, такой как CP1252 или ISO8859-1.

Почему это не может быть установлено по информации, которую вы нам предоставили.

0 голосов
/ 23 июня 2011

Я начал использовать html-коды для немецких символов, и это работает.

functions.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" method="xml" indent="yes" />
<xsl:template name="replace">
    <xsl:param name="text"/>
    <xsl:param name="search"/>
    <xsl:param name="replace"/>
    <xsl:choose>
        <xsl:when test="contains($text, $search)">
            <xsl:variable name="replace-next">
                <xsl:call-template name="replace">
                    <xsl:with-param name="text" select="substring-after($text, $search)"/>
                    <xsl:with-param name="search" select="$search"/>
                    <xsl:with-param name="replace" select="$replace"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="concat(substring-before($text, $search),$replace,$replace-next)"/>
        </xsl:when>
        <xsl:otherwise><xsl:value-of select="$text"/></xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="replaceCH">
    <xsl:param name="value"/>
        <xsl:variable name="temp">
        <xsl:call-template name="replace">
            <xsl:with-param name="text" select="$value"/>
            <xsl:with-param name="search" select="'_'"/>
            <xsl:with-param name="replace" select="''"/>
        </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="temp1">
            <xsl:call-template name="replace">
                <xsl:with-param name="text" select="$temp"/>
        <xsl:with-param name="search" select="'&#214;'"/>
                <xsl:with-param name="replace" select="'OE'"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="temp2">
            <xsl:call-template name="replace">
                <xsl:with-param name="text" select="$temp1"/>
        <xsl:with-param name="search" select="'&#220;'"/>
                <xsl:with-param name="replace" select="'UE'"/>
            </xsl:call-template>
        </xsl:variable> 
        <xsl:value-of select="$temp2"/>     
    </xsl:template>
</xsl:stylesheet>
...