首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT2.0;比xsl:选择内部xsl:function更好的解决方案来添加不同的日期格式?

XSLT2.0;比xsl:选择内部xsl:function更好的解决方案来添加不同的日期格式?
EN

Stack Overflow用户
提问于 2015-06-25 16:37:52
回答 1查看 175关注 0票数 1

我正在努力改进我不久前编写的XSLT代码。我有一个函数将日期转换为XSLT格式。

我有两个案子:

  • 日期为德文格式(例如,10.05.2014)
  • 日期的格式不同。

目前,我正在通过在函数中使用xsl:choose来解决这个问题。当日期包含一个点时,执行此操作,否则执行该操作。

有什么更优雅的方法吗?我觉得我的方式有点烦琐。我能在这里使用某种功能重载吗?

代码语言:javascript
复制
<xsl:function name="ab:convDate">

    <xsl:param name="date" as="xs:string"/>

    <xsl:choose>
        <xsl:when test="contains($date,'.')">
            <xsl:analyze-string select="$date" regex="([0-9]+).([0-9]+).([0-9]+) ([0-9]+):([0-9]+)">
                <xsl:matching-substring>
                    <xsl:variable name="month" select="number(regex-group(2))"/>
                    <xsl:variable name="day" select="number(regex-group(1))"/>
                    <xsl:variable name="year" select="number(regex-group(3))"/>
                    <xsl:variable name="hours" select="number(regex-group(4))"/>
                    <xsl:variable name="minutes" select="number(regex-group(5))"/>
                    <xsl:variable name="dateTime" select="xs:dateTime( 
                                            concat($year, '-', 
                                            format-number($month, '00'), '-', 
                                            format-number($day, '00'), 'T', 
                                            format-number($hours, '00'), ':', 
                                            format-number($minutes, '00'), ':00Z')  
                                )"/>
                    <xsl:value-of select="$dateTime"/>
                </xsl:matching-substring>
            </xsl:analyze-string>
        </xsl:when>

        <xsl:otherwise>
            <xsl:analyze-string select="$date" regex="([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)">
                <xsl:matching-substring>
                    <xsl:variable name="year" select="number(regex-group(1))"/>
                    <xsl:variable name="month" select="number(regex-group(2))"/>
                    <xsl:variable name="day" select="number(regex-group(3))"/>
                    <xsl:variable name="hours" select="number(regex-group(4))"/>
                    <xsl:variable name="minutes" select="number(regex-group(5))"/>
                    <xsl:variable name="seconds" select="number(regex-group(6))"/>
                    <xsl:variable name="dateTime" select="xs:dateTime( 
                                            concat($year, '-', 
                                            format-number($month, '00'), '-', 
                                            format-number($day, '00'), 'T', 
                                            format-number($hours, '00'), ':', 
                                            format-number($minutes, '00'), ':', 
                                            format-number($seconds, '00'),'Z')  
                                )"/>
                    <xsl:value-of select="$dateTime"/>
                </xsl:matching-substring>
            </xsl:analyze-string>

        </xsl:otherwise>

    </xsl:choose>

</xsl:function>

使用

代码语言:javascript
复制
<file date="{ab:convDate(current-group()[7])}"
</file>

适用于这一要素:

代码语言:javascript
复制
<el>2014-02-13 13:42:23</el>

代码语言:javascript
复制
<el>13.02.2014 13:42:23</el>

因此,current-group()[7]等于两个日期字符串中的一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-25 22:08:00

更好的解决方案可能是定义两个与这两种格式相匹配的模板规则:

代码语言:javascript
复制
<xsl:template match="a[contains(., '.')]">

代码语言:javascript
复制
<xsl:template match="a[contains(., '-')]">

但这确实是个人偏好的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31056016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档