XSLT 2.0;比 xsl:function 中的 xsl:choose 更好的解决方案来解决不同的日期格式?
XSLT 2.0; better solution than xsl:choose inside xsl:function to adress different date formats?
我正在尝试改进我之前编写的 XSLT 代码。我有一个将日期转换为 XSLT 格式的函数。
我有两种情况:
- 日期为德语格式(例如 10.05.2014)
- 日期格式不同
目前我正在通过在函数内部使用 xsl:choose
来解决这个问题。当日期包含点时,做这个,否则做那个。
有没有更优雅的方法来做到这一点?我的方式对我来说似乎有点老套。我可以在这里使用某种函数重载吗?
代码
<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>
用法
<file date="{ab:convDate(current-group()[7])}"
</file>
应用于此元素:
<el>2014-02-13 13:42:23</el>
或
<el>13.02.2014 13:42:23</el>
因此 current-group()[7]
等于两个日期字符串之一。
更好的解决方案可能是定义两个匹配两种格式的模板规则:
<xsl:template match="a[contains(., '.')]">
和
<xsl:template match="a[contains(., '-')]">
但这真的是个人喜好问题。
我正在尝试改进我之前编写的 XSLT 代码。我有一个将日期转换为 XSLT 格式的函数。
我有两种情况:
- 日期为德语格式(例如 10.05.2014)
- 日期格式不同
目前我正在通过在函数内部使用 xsl:choose
来解决这个问题。当日期包含点时,做这个,否则做那个。
有没有更优雅的方法来做到这一点?我的方式对我来说似乎有点老套。我可以在这里使用某种函数重载吗?
代码
<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>
用法
<file date="{ab:convDate(current-group()[7])}"
</file>
应用于此元素:
<el>2014-02-13 13:42:23</el>
或
<el>13.02.2014 13:42:23</el>
因此 current-group()[7]
等于两个日期字符串之一。
更好的解决方案可能是定义两个匹配两种格式的模板规则:
<xsl:template match="a[contains(., '.')]">
和
<xsl:template match="a[contains(., '-')]">
但这真的是个人喜好问题。