Hallo,
ich brauche Hilfe bei der Addition von Zeiten. Ich habe in einem XML-Dokument die Dauer von Prozessen dokumetiert im Format Minute:Sekunde:Millisekunde stehen und möchte diese gerne summieren. Mit der Funktion sum() oder eine Schleife über die Elemente funktioniert leider nicht.
Kann mir hier jemand sagen, wie ich das "Zeitformat" addieren kann?
Im Prinzip nur manuell. Am einfachsten wäre es, Du rechnest das Zeitformat einmal in eine einzige Zahl um (d.h. Minutenanteil * 60000 + Sekundenanteil * 1000 + Millisekundenanteil), addierst die und rechnest hinterher wieder zurück.
Ich hab Dir das mal augedröselt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/zeiten">
<xsl:call-template name="addiere-zeiten">
<xsl:with-param name="knoten" select="child::zeit[1]" />
<xsl:with-param name="summe" select="0" />
<xsl:with-param name="anzahl" select="0" />
</xsl:call-template>
</xsl:template>
<xsl:template name="addiere-zeiten">
<xsl:param name="knoten" />
<xsl:param name="summe" />
<xsl:param name="anzahl" />
<xsl:choose>
<xsl:when test="$knoten">
<xsl:variable name="minuten" select="substring-before($knoten, ':')" />
<xsl:variable name="sekunden" select="substring-before(substring-after($knoten, ':'), ':')" />
<xsl:variable name="millisekunden" select="substring-after(substring-after($knoten, ':'), ':')" />
<xsl:variable name="zeit" select="number($minuten) * 60000 + number($sekunden) * 1000 + number($millisekunden)" />
<xsl:call-template name="addiere-zeiten">
<xsl:with-param name="knoten" select="$knoten/following-sibling::zeit[1]" />
<xsl:with-param name="summe" select="$summe + $zeit" />
<xsl:with-param name="anzahl" select="$anzahl + 1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="zeige-summe-und-durchschnitt">
<xsl:with-param name="summe" select="$summe" />
<xsl:with-param name="anzahl" select="$anzahl" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="zeige-summe-und-durchschnitt">
<xsl:param name="summe" />
<xsl:param name="anzahl" />
<xsl:variable name="durchschnitt">
<xsl:choose>
<xsl:when test="$anzahl != 0">
<xsl:value-of select="$summe div $anzahl" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<p>
<xsl:text>Die Summe der Zeiten ist: </xsl:text>
<xsl:call-template name="zeige-zeit">
<xsl:with-param name="zeit" select="$summe" />
</xsl:call-template>
</p>
<p>
<xsl:text>Der Durschschnitt der Zeiten ist: </xsl:text>
<xsl:call-template name="zeige-zeit">
<xsl:with-param name="zeit" select="$durchschnitt" />
</xsl:call-template>
</p>
</xsl:template>
<xsl:template name="zeige-zeit">
<xsl:param name="zeit" />
<xsl:if test="$zeit < 0">
<xsl:text>-</xsl:text>
</xsl:if>
<xsl:variable name="zeit">
<xsl:choose>
<xsl:when test="$zeit < 0">
<xsl:value-of select="-$zeit" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$zeit" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="minuten">
<xsl:value-of select="floor($zeit div 60000)" />
</xsl:variable>
<xsl:variable name="temp1">
<xsl:value-of select="$zeit - $minuten * 60000" />
</xsl:variable>
<xsl:variable name="sekunden">
<xsl:value-of select="floor($temp1 div 1000)" />
</xsl:variable>
<xsl:variable name="millisekunden">
<xsl:value-of select="$temp1 - $sekunden * 1000" />
</xsl:variable>
<xsl:value-of select="concat(format-number($minuten, '00'), ':', format-number($sekunden, '00'), ':', format-number($millisekunden, '0000'))" />
</xsl:template>
</xsl:stylesheet>
XML-File dazu:
<?xml version="1.0" encoding="UTF-8"?>
<zeiten>
<zeit>00:01:0000</zeit>
<zeit>00:01:0000</zeit>
<zeit>00:01:0000</zeit>
<zeit>00:01:0000</zeit>
<zeit>00:01:0000</zeit>
<zeit>00:01:0000</zeit>
<zeit>20:01:0000</zeit>
</zeiten>
Kleine Anmerkung: Es ist übrigens üblich, Millisekunden in der Form Minute:Sekunde.Millisekunde anzugeben (d.h. Punkt statt Doppelpunkt), also "12:34.2346".
Viele Grüße,
Christian