java - 如果存在德语字符,则 XSLT 无法转换

标签 java xml xslt xslt-1.0

我正在使用 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 应用程序无法对此进行转换并抛出此错误:

Invalid byte 2 of 2-byte UTF-8 sequence

这是主要的 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

我该如何解决这个问题?

最佳答案

XML 解析器将您的 XML 源视为 UTF-8,但它不是 UTF-8,而是其他编码,例如 CP1252 或 ISO8859-1。

无法根据您提供给我们的信息确定为什么会这样。

关于java - 如果存在德语字符,则 XSLT 无法转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431520/

相关文章:

xml - 如何将属性添加到节点的所有特定子节点

c# - Stream 和 XmlTextwriter...请求未正确接收

java - 如何防止XXE攻击

xslt - 将 XSL 模板应用于两个不同源文件之一时,如何在另一个源文件中引用 "matching"节点?

xml - XSLT 和 XSL-FO 之间有什么区别?

java - JACKSON JSON 反序列化问题与重载 setter

java - 如何删除非字母字符同时保留单词之间的空格?

java-在32位Windows中使用大于1Gb的java堆空间文件

xml - 使用 XSLT 排序

java - 尝试在 hibernate 中指定属性的默认值