如何在XSLT v1.0中翻译字符串中的非字母数字字符

时间:2014-03-26 20:27:22

标签: xslt

我使用XSLT v1.0并希望将“UÅ1atx-ß3Å”翻译为“UAA1atx-SS3AA” 其中“Å”=“AA”和“ß”=“SS”,但到目前为止还没有运气。

我只能将小写更改为大写并且不删除任何字母数字字符,而不是替换为我要替换的字符。

variable name="OddChars">ÄÖÅÜÉäöåüé variable name="RegChars">AOAUEaoaue

variable name="OddChars" select="('Ä','Ö','Å','Ü','É','ä','ö','å','ü','é','ß')" variable name="RegChars" select="('Ae','Oe','AA','Ue','Ee','ae','oe','aa','ue','ee','SS')"

variable name="fr" select="('[Å-é]', 'Å', 'ß')" variable name="to_newChar" select="('Y', 'A', 'S')"

但他们都没有工作

谢谢

2 个答案:

答案 0 :(得分:1)

对于 XSLT-1.0 我会自己制作一个映射xml,我称之为translationMapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<translations>
    <translate OddChar="Ä" RegChar="Ae"/>
    <translate OddChar="ä" RegChar="ae"/>
    <translate OddChar="Ö" RegChar="Oe"/>
</translations>

您可以使用以下模板,它将逐个字符地循环显示文本并检查它是否在映射中找到当前字符并在找到匹配项时替换它(请注意,这可能不会执行快速取决于您提供的文本数量)

<xsl:template name="translate">
    <xsl:param name="text"/>
    <xsl:variable name="char" select="substring($text,1,1)"/>
    <xsl:variable name="rest" select="substring($text,2)"/>
    <xsl:if test="$text!=''">
        <xsl:choose>
            <xsl:when test="document('translationMapping.xml')/*/translate[@OddChar=$char]">
                <xsl:value-of select="document('translationMapping.xml')/*/translate[@OddChar=$char]/@RegChar"/>
                <xsl:call-template name="translate">
                    <xsl:with-param name="text" select="$rest"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$char"/>
                <xsl:call-template name="translate">
                    <xsl:with-param name="text" select="$rest"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:template>

您可以在与text()匹配的模板中调用模板:

<xsl:template match="text()">
    <xsl:call-template name="translate">
        <xsl:with-param name="text" select="."/>
    </xsl:call-template>
</xsl:template>

XSLT-2.0 已经使用xsl:character-map构建了对此类操作的支持,您可以这样定义:

<xsl:character-map name="char">
    <xsl:output-character character="Ä" string="Ae"/>
    <xsl:output-character character="Ö" string="oe"/>
    ...
</xsl:character-map>

XSLT处理器应该为您替换字符。

答案 1 :(得分:0)

让我们假设您的来源是:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<string>UÅ1atx-ß3Å</string>

现在,我认为您需要的是一个递归模板,它替换字符串中的字符,直到该字符在该初始字符串中不存在,因此您的代码可能是:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/string">
    <xsl:call-template name="replace">
        <xsl:with-param name="string" select="." />
        <xsl:with-param name="toReplace" select="'Å'" />
        <xsl:with-param name="replaced" select="'AA'" />
    </xsl:call-template>
</xsl:template>

<xsl:template name="replace">
    <xsl:param name="string" />
    <xsl:param name="toReplace" />
    <xsl:param name="replaced" />

    <xsl:variable name="aux">
        <xsl:value-of
            select="concat(substring-before($string, $toReplace), $replaced, substring-after($string, $toReplace))" />
    </xsl:variable>


    <xsl:variable name="aux2">
        <xsl:choose>
            <xsl:when test="contains($aux, $toReplace)">
                <xsl:call-template name="replace">
                    <xsl:with-param name="string" select="$aux" />
                    <xsl:with-param name="toReplace" select="$toReplace" />
                    <xsl:with-param name="replaced" select="$replaced" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$aux" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

    <xsl:value-of select="$aux2" />
</xsl:template>

然后你的出局是:

<?xml version="1.0" encoding="UTF-8"?>UAA1atx-ß3AA

我知道你需要更换更多的角色,但有了这个,你可以完成其余的工作。