XSLT 2.0:从DOB计算年龄

时间:2014-03-03 14:03:12

标签: date xslt duration

是否有一个函数来计算XSLT 2.0中2个日期的持续时间?

我正在尝试从出生日期和当前日期计算以下内容:

  • 年龄
  • 年龄

3 个答案:

答案 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 &lt; $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()获得,减去结果,然后在第一个日期晚于第二个日期时减去一个 - 这意味着基本上自己编写逻辑。