我想在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且无法升级。
答案 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:
前缀必须绑定到命名空间!