是否有一个函数来计算XSLT 2.0中2个日期的持续时间?
我正在尝试从出生日期和当前日期计算以下内容:
答案 0 :(得分:4)
我不知道XSLT中的预定义函数来完成此任务。但是你总是可以编写自己的代码。下面的解决方案不使用函数,但您可以轻松地将其重写为函数。
计算的想法取自here。
还有其他(更短)的方法,例如,对于特定于XSLT 2.0的解决方案,请参阅Mads Hansen的回答here。但是,您必须稍微调整您在那里找到的样式表,因为它会输出几天。
<强>输入强>
<root>
<birth>1964-10-10</birth>
</root>
<强>样式表强>
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:variable name="Birthday" select="//birth[1]"/>
<xsl:variable name="Age">
<xsl:choose>
<xsl:when test="month-from-date(current-date()) > month-from-date($Birthday) or month-from-date(current-date()) = month-from-date($Birthday) and day-from-date(current-date()) >= day-from-date($Birthday)">
<xsl:value-of select="year-from-date(current-date()) - year-from-date($Birthday)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="year-from-date(current-date()) - year-from-date($Birthday) - 1" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template match="/root">
<result>
<xsl:value-of select="$Age"/>
</result>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?><result>49</result>
答案 1 :(得分:3)
注意:这是一个XSLT 1.0解决方案;这里使用XSLT 2.0没有什么好处(除了提供日期组件的专用函数的便利之外 - 无论如何这都是相当简单的。)
<xsl:template match="/">
<age-in-months>
<xsl:call-template name="age-in-months">
<xsl:with-param name="date-of-birth" select="'2013-03-03'"/>
<xsl:with-param name="current-date" select="'2014-03-02'"/>
</xsl:call-template>
</age-in-months>
</xsl:template>
<xsl:template name="age-in-months">
<xsl:param name="date-of-birth" />
<xsl:param name="current-date" />
<xsl:param name="y1" select="substring($date-of-birth, 1, 4)"/>
<xsl:param name="y2" select="substring($current-date, 1, 4)"/>
<xsl:param name="m1" select="substring($date-of-birth, 6, 2)"/>
<xsl:param name="m2" select="substring($current-date, 6, 2)"/>
<xsl:param name="d1" select="substring($date-of-birth, 9, 2)"/>
<xsl:param name="d2" select="substring($current-date, 9, 2)"/>
<xsl:value-of select="12 * ($y2 - $y1) + $m2 - $m1 - ($d2 < $d1)"/>
</xsl:template>
</xsl:stylesheet>
请注意,年龄可以通过以下方式获得:
floor($age-in-months div 12)
所以如果你需要它,同一个模板可以同时提供。
答案 2 :(得分:1)
是否有一个函数来计算XSLT 2.0中2个日期的持续时间?
是。除了它是一个操作员,而不是一个功能。只需使用减法运算符“ - ”。
例如
current-date() - xs:date('1920-03-04')
给我父亲的年龄:
P34332D
由于闰年的复杂性,让他的年龄和数月变得更复杂(你对2月29日出生的人做了什么?)。您可以通过除以xs:dayTimeDuration('P1D')将此持续时间减少到几天,然后您可以通过将此除以365.25来得到总年数的合理近似值,但更准确的计算可能是通过在两个日期使用year-from-date()获得,减去结果,然后在第一个日期晚于第二个日期时减去一个 - 这意味着基本上自己编写逻辑。