XSLT:替换字符串中的多个字符

时间:2014-11-25 17:38:42

标签: xslt

我有以下字符串,表示一周中的几天:

1, 2, 3, 4, 5

我想用以下内容替换这些值:

M, Tu, W, ...

我不知道有一个XSLT 2.0功能可以一次性处理。有谁知道如何实现这个目标?

由于

2 个答案:

答案 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中,这将更加冗长,但可以使用递归命名模板完成。