重新格式化字符串

时间:2014-08-19 12:50:55

标签: xml xslt xml-parsing

我有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

1 个答案:

答案 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>