我有以下字符串,表示一周中的几天:
1, 2, 3, 4, 5
我想用以下内容替换这些值:
M, Tu, W, ...
我不知道有一个XSLT 2.0功能可以一次性处理。有谁知道如何实现这个目标?
由于
答案 0 :(得分:2)
类似于C. M. Sperberg-McQueen的答案,仅使用序列作为变量......
XML输入
<doc>
<x>1, 2, 3, 4, 5</x>
<x>1, 3, 5</x>
<x>2, 4</x>
</doc>
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="daysOfWeek" select="('M','Tu','W','Th','F','Sa','Su')"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="x">
<x>
<xsl:value-of select="for $n in tokenize(.,',')
return $daysOfWeek[position()=number(normalize-space($n))]"
separator=", "/>
</x>
</xsl:template>
</xsl:stylesheet>
XML输出
<doc>
<x>M, Tu, W, Th, F</x>
<x>M, W, F</x>
<x>Tu, Th</x>
</doc>
答案 1 :(得分:1)
不,XSLT中没有内置函数,它将使用逗号分隔的字符串,其数字在1-7(或0-6)范围内,并返回相应的一个或两个逗号分隔的序列 - 一周中几天的字符缩写。您将不得不使用多个函数调用。
为简单起见,假设您使用的是XSLT 2.0:
<xsl:variable name="daynames" as="element(day)*">
<day n="1">M</day>
<day n="2">Tu</day>
<day n="3">W</day>
<day n="4">Th</day>
<day n="5">F</day>
<day n="6">Sa</day>
<day n="7">Su</day>
</
<xsl:variable name="string" value="'1, 2, 3, 4, 5'"/>
<xsl:value-of select="string-join(
for $n in tokenize($string,', ') return $days[@n=$n]/string(),
', ')"/>
在XSLT 1.0中,这将更加冗长,但可以使用递归命名模板完成。