我的xsl变量:
<xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>
我需要翻译或替换string
变量数据:
Satur - Sun - Mon - Tues - Wednes - Thurs - Fri
所以输出应该是这样的:
Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday
................................
@Mads Hansen
我是xsl
和xml
的新手,我尝试了你的代码,但它不起作用
100%
这是错误的
我的xsl文件:
<xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>
<xsl:template match="/">
<html>
<body>
<h2>result: </h2>
<xsl:value-of
select="for $token in tokenize($string, '\s-\s')
return(
document('')/*/config/replacement[find[.=$token]]/replace,
$token
)[1]"
separator=" - "
/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我的xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<config>
<replacement>
<find>Satur</find>
<replace>Saturday</replace>
</replacement>
<replacement>
<find>Sun</find>
<replace>Sunday</replace>
</replacement>
<replacement>
<find>Mon</find>
<replace>Monday</replace>
</replacement>
<replacement>
<find>Tues</find>
<replace>Tuesday</replace>
</replacement>
<replacement>
<find>Wednes</find>
<replace>Wednesday</replace>
</replacement>
<replacement>
<find>Thurs</find>
<replace>Thursday</replace>
</replacement>
<replacement>
<find>Fri</find>
<replace>Friday</replace>
</replacement>
</config>
我的代码有什么问题?
答案 0 :(得分:3)
<强>予。 XPath 2.0(XSLT 2.0)解决方案:
使用以下XPath 2.0 one-liner :
concat(replace(.,'\s+-\s*', 'day - '), 'day')
基于XSLT的验证:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:sequence select="concat(replace(.,'\s+-\s*', 'day - '), 'day')"/>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<t>Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</t>
产生了想要的正确结果:
Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday
<强> II。 XSLT 1.0解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:call-template name="replace">
<xsl:with-param name="pS" select=
"concat(normalize-space(translate(., '-', ' ')), 'day')"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="pS"/>
<xsl:param name="pTarget" select="' '"/>
<xsl:param name="pReplacement" select="'day - '"/>
<xsl:if test="$pS">
<xsl:value-of select="substring-before(concat($pS,$pTarget), $pTarget)"/>
<xsl:if test="contains($pS, $pTarget)">
<xsl:value-of select="$pReplacement"/>
</xsl:if>
<xsl:call-template name="replace">
<xsl:with-param name="pS" select="substring-after($pS, $pTarget)"/>
<xsl:with-param name="pTarget" select="$pTarget"/>
<xsl:with-param name="pReplacement" select="$pReplacement"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当对同一个XML文档(上面)应用此转换时,会生成相同的想要的正确结果:
Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday
答案 1 :(得分:2)
XSLT 2.0解决方案:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0"
xmlns:my="http://stackoverflow.com/questions/12502665/xsl-how-to-translate-or-replace-string">
<xsl:output indent="yes"/>
<xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>
<my:config>
<replacement>
<find>Satur</find>
<replace>Saturday</replace>
</replacement>
<replacement>
<find>Sun</find>
<replace>Sunday</replace>
</replacement>
<replacement>
<find>Mon</find>
<replace>Monday</replace>
</replacement>
<replacement>
<find>Tues</find>
<replace>Tuesday</replace>
</replacement>
<replacement>
<find>Wednes</find>
<replace>Wednesday</replace>
</replacement>
<replacement>
<find>Thurs</find>
<replace>Thursday</replace>
</replacement>
<replacement>
<find>Fri</find>
<replace>Friday</replace>
</replacement>
</my:config>
<xsl:template match="/">
<xsl:value-of
select="for $token in tokenize($string, '\s-\s')
return
(
document('')/*/my:config/replacement[find[.=$token]]/replace,
$token
)[1]"
separator=" - " />
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:2)
@ Mads&#39;的一个变种回答:
<xsl:template match="/">
<xsl:value-of
select="for $token in tokenize($string, '\s-\s')
return concat($token, 'day')"
separator=" - " />
</xsl:template>
然后您可以省略<my:config>
。