0

XSLT の一部として、"Duration" 要素のすべての値を追加し、値を表示する必要があります。さて、以下の XML は、私が取り組んでいるより大きな XML の一部です。以下の XML では、a/TimesheetDuration/Day*/Duration を一致させ、値を追加して表示する必要があります。すべての値を変数に保存して追加したくありません。これを行う他のクリーンな方法はありますか?

<?xml version="1.0" ?>
<a>
<TimesheetDuration>
  <Day1>
    <BusinessDate>6/12/2013</BusinessDate>
    <Duration>03:00</Duration>
  </Day1>
  <Day2>
    <BusinessDate>6/13/2013</BusinessDate>
    <Duration>04:00</Duration>
  </Day2>
  <Day3>
    <BusinessDate>6/14/2013</BusinessDate>
    <Duration>05:00</Duration>
  </Day3>
</TimesheetDuration>
</a>
4

2 に答える 2

1

期間が HH:MM の形式であると仮定すると、XPath 2.0 ソリューションは次のようになります。

sum(for $d in a//Duration 
    return xs:dayTimeDuration(replace($d, '(..):(..)', 'PT$1H$2M')))
于 2013-07-15T07:01:01.257 に答える
0

xslt 1.0 では、たとえば次のスタイルシートでそれを行うことができます

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

    <xsl:template match="/">
        <Durations>
            <xsl:apply-templates select="a/TimesheetDuration/node()[starts-with(name(),'Day')]" />


        <xsl:variable name="hours">
            <xsl:call-template name="sumHours">
                <xsl:with-param name="Day" select="a/TimesheetDuration/node()[starts-with(name(),'Day')][1]" />
            </xsl:call-template>
        </xsl:variable>

        <SumOfHours>
            <xsl:value-of select="$hours" />
        </SumOfHours>
        <!-- Sum of minutes would be calculated similarly -->
        </Durations>

    </xsl:template>

    <xsl:template match="node()[starts-with(name(),'Day')]">
        <xsl:copy-of select="Duration" />
    </xsl:template>

    <xsl:template name="sumHours">
        <xsl:param name="tmpSum" select="0" />
        <xsl:param name="Day" />

        <xsl:variable name="newTmpSum" select="$tmpSum + substring-before($Day/Duration, ':')" />
        <xsl:choose>
            <xsl:when test="$Day/following-sibling::node()[starts-with(name(),'Day')]">
                <xsl:call-template name="sumHours">
                    <xsl:with-param name="tmpSum" select="$newTmpSum" />
                    <xsl:with-param name="Day" select="$Day/following-sibling::node()[starts-with(name(),'Day')]" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$newTmpSum" />
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>
</xsl:stylesheet>

出力を生成します

<?xml version="1.0" encoding="UTF-8"?>
<Durations>
    <Duration>03:00</Duration>
    <Duration>04:00</Duration>
    <Duration>01:00</Duration>
    <SumOfHours>8</SumOfHours>
</Durations>
于 2013-07-15T05:52:02.473 に答える