我有XML,其中一些日期和日期时间字符串以somtimes外来格式提供:
DDMMYYYYHHMM(24小时格式的小时)
我试图在XSLT中创建一个用户定义的函数,以便能够重新格式化这样的字符串(我知道如何在其他语言中执行此操作,但我还没有关于如何在XSLT中执行此操作的线索) 。我的想法是这样的:
<xsl:value-of select="udf:reFormat('230820141345','DDMMCCYYHHmm','HH:mm:00')"/>
会导致:
13:45:00
和
<xsl:value-of select="udf:reFormat('230820141345','DDMMCCYYHHmm','CCYY-MM-DD')"/>
会导致:
2014-08-23
答案 0 :(得分:1)
如评论中所述,显而易见的方法是将数据解析为xs:dateTime,从来没有这么简单,这是一个能够满足你想要的功能:
<xsl:function name="udf:reFormat">
<xsl:param name="in"/>
<xsl:param name="inPattern"/>
<xsl:param name="outPattern"/>
<!-- analyze $outPattern to find occurrence of any sequence of same charachter -->
<xsl:analyze-string select="$outPattern" regex="(\w)\1+">
<xsl:matching-substring>
<xsl:variable name="match" select="."/>
<!-- check if $match is in $inPattern -->
<xsl:choose>
<xsl:when test="contains($inPattern, $match)">
<!-- get position of $match in $inPattern -->
<xsl:variable name="positionInPattern"
select="string-length(substring-before($inPattern,$match))+1"/>
<!-- get substring from $in -->
<xsl:value-of select="substring($in, $positionInPattern, string-length($match))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:function>