国家等的 XSLT 特殊字符
XSLT special character for countrys etc
我的 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]:我的意思是,他们是一些例外,比如以色列或立陶宛,特殊字符不应该生效。
我现在该如何解决这个问题?
这里有一种方法可以做到这一点。
(我不会说德语,所以不确定这是否适用于所有情况!)
我已修改您的输入以添加更多测试用例。
<?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>
我的 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]:我的意思是,他们是一些例外,比如以色列或立陶宛,特殊字符不应该生效。
我现在该如何解决这个问题?
这里有一种方法可以做到这一点。 (我不会说德语,所以不确定这是否适用于所有情况!) 我已修改您的输入以添加更多测试用例。
<?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>