我正在使用版本1.0 XSLT,我遇到德语字符问题。如果XML元素数据中有任何德语字符,则XSLT无法转换任何内容,输出完全为空。
一个简短的例子:
<root>
<table name="users">
<row>
<field attr1="name">GÜNTER</field>
</row>
</table>
</root>
输出应为:
<users>
<name>GUENTER</name>
</users>
我在XSL中使用utf-8编码,当我使用Eclipse时它可以被转换。在我的应用程序中,这些XSL文件存储在Oracle数据库中,并在应用程序启动时进行缓存。但是我的Java应用程序无法对此进行转换并抛出此错误:
2字节UTF-8序列的字节2无效
这是主要的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>
这是functions.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并配置如下编码:
hibernate.connection.characterEncoding = UTF-8
我该如何解决这个问题?
答案 0 :(得分:3)
XML解析器将您的XML源视为UTF-8,但它不是UTF-8,而是采用其他编码,如CP1252或ISO8859-1。
为什么会出现这种情况无法从您提供给我们的信息中确定。
答案 1 :(得分:0)
我已经开始使用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="'Ö'"/>
<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>