将以小时和分钟显示的时间转换为十进制,并使用xslt 1.0计算以小时为单位的总和

时间:2013-03-28 13:02:24

标签: xslt-1.0

我想使用XSLT 1.0实现这一目标。小时数以小时和分钟表示(例如:10:3​​0基本上是10小时30分钟)。我需要将其转换为仅几小时(10.50),然后计算所有小时节点的总和。

以下是源XML文档:

<Record>
   <hours>10:30</hours> 
   <hours>20:30</hours>
   <hours>10:60</hours> 
 </Record>

输出:

 <Record>
   <TotalHours>42.0</TotalHours>
 </Record>

1 个答案:

答案 0 :(得分:0)

在XSLT 1.0中:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>

    <xsl:template match="Record">
        <Record>
            <TotalHours>
                <xsl:value-of select="
                    sum(hours/number(substring-before(., ':'))) + 
                    sum(hours/number(substring-after(., ':'))) div 60
                "/>
            </TotalHours>
        </Record>
    </xsl:template>

</xsl:transform>

<强> Working example

如果你还想要分钟而不是一小时:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>

    <xsl:template match="Record">
        <Record>
            <TotalHours>
                <xsl:value-of select="
                    concat(
                        sum(hours/number(substring-before(., ':'))) + floor(sum(hours/number(substring-after(., ':'))) div 60),   
                    '.',
                        format-number(floor(sum(hours/number(substring-after(., ':'))) mod 60), '00')
                    )
                "/>
            </TotalHours>
        </Record>
    </xsl:template>

</xsl:transform>

** Working example