Специальный символ XSLT для стран и т. Д. - PullRequest
1 голос
/ 06 августа 2020

У меня небольшая проблема с отображением XSLT.

Я получил файл XML в качестве входных данных со следующими данными:

<?xml version="1.0" encoding="UTF-8"?>
<Request>
    <Query>
        <Parameter name="staat">OESTERREICH</Parameter>
    </Query>
</Request>

Я пытаюсь получить состояние и установите специальный символ для OE, UE, AE и SS.

Специальные символы:

OE = Ö
UE = Ü
AE = Ä
SS = ẞ

Я пробовал следующий XSLT Script / Mapping: '

<?xml version="1.0" encoding="UTF-8"?><?xe.source ../TemporaryFiles/Test_XML_1.xml#Request?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output media-type="text/xml" method="xml"></xsl:output>
    <xsl:template match="/">
        <root>
        <first_two_letters>
            <xsl:value-of select="substring(upper-case(/Request/Query/Parameter[@name='staat']),1,2)"></xsl:value-of>
        </first_two_letters>
        <xsl:choose>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='OE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat2'], 'OE', 'Ö'),1,2), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat2']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),3))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='AE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat2'], 'AE', ''),1,2), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat2']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),3))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='UE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat2'], 'UE', 'Ü'),1,2), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat2']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),3))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='SS'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat2'], 'SS', 'ẞ'),1,2), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat2']), 'ae', 'ä'), 'oe', 'ö'), 'ss', 'ß'),3))"></xsl:value-of>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(substring(/Request/Query/Parameter[@name='staat2'],1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat2']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:otherwise>
        </xsl:choose>
        </root>
    </xsl:template>
</xsl:stylesheet>

Скрипт работает так хорошо, но результат:

<root>
    <first_two_letters>OE</first_two_letters>
</root>

То, что я действительно ожидал от своего вывода, это:

<root>
    <first_two_letters>OE</first_two_letters>
    Österreich
</root>

--- РЕДАКТИРОВАТЬ: - -

После небольшой справочной формы @Boldewyn в командах, вот рабочий код:

<?xml version="1.0" encoding="UTF-8"?><?xe.source ../TemporaryFiles/Test_XML_1.xml#Request?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output media-type="text/xml" method="xml"></xsl:output>
    <xsl:template match="/">
        <root>
        <first_two_letters>
            <xsl:value-of select="substring(upper-case(/Request/Query/Parameter[@name='staat']),1,2)"></xsl:value-of>
        </first_two_letters>
        <xsl:choose>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='OE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat'], 'OE', 'Ö'),1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='AE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat'], 'AE', ''),1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='UE'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat'], 'UE', 'Ü'),1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:when>
            <xsl:when test="substring(/Request/Query/Parameter[@name='staat'],1,2)='SS'">
                <xsl:value-of select="concat(substring(replace(/Request/Query/Parameter[@name='staat'], 'SS', 'ẞ'),1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(substring(/Request/Query/Parameter[@name='staat'],1,1), substring(replace(replace(replace(lower-case(/Request/Query/Parameter[@name='staat']), 'ae', 'ä'), 'oe', 'ö'), 'ue', 'ü'),2))"></xsl:value-of>
            </xsl:otherwise>
        </xsl:choose>
        </root>
    </xsl:template>
</xsl:stylesheet>

Но теперь я решил проблему, как сказано в комментариях:

Israel = Isräl.

[2020-08-06 16:26]: Я имею в виду, что это некоторые исключения, такие как Израиль или Литва, где специальные символы не должны действовать.

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

1 Ответ

1 голос
/ 06 августа 2020

Вот как это можно сделать. (Я не говорю по-немецки, поэтому не уверен, что это работает для всех случаев!) Я изменил ваш ввод, чтобы добавить больше тестовых примеров.

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>
  
  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="Request/Query/Parameter[@name='staat']"/>
    </root>
  </xsl:template>

  <xsl:template match="Parameter">
      <xsl:variable name="text" select="."/>
      <xsl:variable name="upper2" select="upper-case(substring($text,1,2))"/>
      <first_two_letters>
        <xsl:value-of select="substring(upper-case($text),1,2)"></xsl:value-of>
      </first_two_letters>
      <!-- Replacement in first 2 characters -->
      <xsl:value-of select="if($upper2='OE' or $upper2='AE' or $upper2='UE' or $upper2='SE')
                            then replace(replace(replace(replace(upper-case(substring($text,1,2)),'OE','Ö'),'AE','Ä'),'UE','Ü'),'SS','ẞ')
                            else substring($text,1,2)"/>
      <!-- Replacement in remainging characters -->
      <xsl:value-of select="replace(replace(replace(lower-case(substring($text,3,string-length($text)-2)), 'ae', 'ä'), 'oe', 'ö'), 'ss', 'ß')"/>
  </xsl:template>
  
</xsl:stylesheet>

Смотрите, как это работает: https://xsltfiddle.liberty-development.net/3Mvnt3M

...