如何在XSLT 1.0中循环使用字符串标记?

时间:2016-05-03 09:04:41

标签: xml xslt-1.0

我想在DD,MM,/,YYYY等许多元素中对表示DD / MM / YYYY等日期格式的字符串进行标记,以便进行转换

<tag date-format="DD/MM/YYYY" />

<container>
  <number:day number:style="long" />
  <number:text>/</number:text>
  <number:month number:style="long" />
  <number:text>/</number:text>
  <number:year number:style="long" />
</container>

因此,标签

<tag date-format="MM-DD-YYYY" />

应转换为

<container>
  <number:month number:style="long" />
  <number:text>-</number:text>
  <number:day number:style="long" />
  <number:text>-</number:text>
  <number:year number:style="long" />
</container>

我对XSLT 1.0中如何做到这一点没有任何想法,因为它不支持tokenizer和正则表达式。

请考虑我已绑定到XSLT 1.0且无法升级

1 个答案:

答案 0 :(得分:1)

以此为出发点:

<xsl:template match="tag[@date-format]">
    <container>
        <xsl:call-template name="analyze-date-format">
            <xsl:with-param name="date-format" select="@date-format" />
        </xsl:call-template>
    </container>
</xsl:template>

<xsl:template name="analyze-date-format">
    <xsl:param name="date-format"/>
    <xsl:variable name="separators" select="translate($date-format, 'YMD', '')" />
    <xsl:variable name="separator" select="substring($separators, 1, 1)" />
    <xsl:variable name="token">
        <xsl:choose>
            <xsl:when test="$separator">
                <xsl:value-of select="substring-before($date-format, $separator)" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$date-format" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:choose>
        <xsl:when test="$token = 'YYYY'">
            <number:year number:style="long" />
        </xsl:when>
        <xsl:when test="$token = 'MM'">
            <number:month number:style="long" />
        </xsl:when>
        <xsl:when test="$token = 'DD'">
            <number:day number:style="long" />
        </xsl:when>
    </xsl:choose> 
    <xsl:if test="$separators">
        <number:text>
            <xsl:value-of select="$separator" />
        </number:text>
         <!-- recursive call -->
        <xsl:call-template name="analyze-date-format">
            <xsl:with-param name="date-format" select="substring-after($date-format, $separator)" />
        </xsl:call-template>
    </xsl:if>
</xsl:template>

这假设所有令牌都是大写的(也可能是其他一些假设)。您可能希望为其他令牌类型添加更多测试。

请注意,number:前缀必须绑定到命名空间!