使用xslt字符串函数更改日期格式

时间:2013-01-11 16:32:15

标签: string date xslt substring

我必须用XSLT解决问题而且不知所措。我想我需要字符串长度函数,有些选择测试和子字符串,但我不知道。问题相对简单。

我的xml看起来像下面的示例。但是,我使用了YYYY,MM和DD来表示日期中的数字。

<date normal=”YYYMMDD”> Month, DD, YYYY</date>
<date normal=”YYYY/YYYY”> YYYY-YYYY</date>
<date normal=”YYYYMM”> Month, YYYY</date>
<date normal=”YYYYMM>MM-YYYY</date>
<name normal=”Smith, John”> John Smith </name>

我需要按原样打印所有元素,除了JUST两个具有属性normal=”YYYYMM”的元素。它们需要打印,但格式为normal=YYYY-MM

我不能依赖元素中的素材,因为它往往是各种不同的格式,因为它是自由文本。

我一直在尝试使用字符串长度函数来识别元素日期中包含6个字符的属性值。但后来我无法弄清楚如何用连字符分割输出中的字符串。我猜它使用了一个子串函数,但我无法让所有东西一起工作。

感谢您提供任何建议, 恭

2 个答案:

答案 0 :(得分:0)

这样的东西?:

<xsl:choose>
  <xsl:when text="string-length(@normal) = 6 and number(@normal) = number(@normal)">
    <xsl:value-of select="concat(substring(@normal, 1, 4), '-', substring(@normal, 5, 2))" />
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="@normal" />
  </xsl:otherwise>
</xsl:choose>

number(@normal) = number(@normal)检查确保@normal是一个数字,因为您在normal属性中看起来也有一些非日期值。它有可能是一个6位数的非日期数字吗?

答案 1 :(得分:0)

这个完整而短暂的转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="@normal[string-length()=6]">
  <xsl:attribute name="normal">
   <xsl:value-of select="concat(substring(.,1,4),'-',substring(.,5))"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于以下XML文档(提供的片段包装到单个顶部元素中):

<t>
    <date normal="YYYMMDD"> Month, DD, YYYY</date>
    <date normal="YYYY/YYYY"> YYYY-YYYY</date>
    <date normal="YYYYMM"> Month, YYYY</date>
    <date normal="YYYYMM">MM-YYYY</date>
    <name normal="Smith, John"> John Smith </name>
</t>

会产生想要的正确结果:

<t>
   <date normal="YYYMMDD"> Month, DD, YYYY</date>
   <date normal="YYYY/YYYY"> YYYY-YYYY</date>
   <date normal="YYYY-MM"> Month, YYYY</date>
   <date normal="YYYY-MM">MM-YYYY</date>
   <name normal="Smith, John"> John Smith </name>
</t>