変更するためのアクセス権がないXMLフィードに基づいてプレゼンテーションのスケジュールを公開するWebページに取り組んでいます。
フィードは次のようになります。
<track name="Track 1">
<session name="Session 1" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 1">
...presentation info
</presentation>
<presentation name="Presentation 2">
...presentation info
</presentation>
</session>
<session name="Session 2" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45">
<presentation name="Presentation 3">
...presentation info
</presentation>
<presentation name="Presentation 4">
...presentation info
</presentation>
</session>
<session name="Session 3" starttime="2012-06-07 08:45" endtime="2012-06-07 10:45">
<presentation name="Presentation 5">
...presentation info
</presentation>
<presentation name="Presentation 6">
...presentation info
</presentation>
</session>
</track>
現在、<xsl:for-each select="session">
情報を引き出すためのループを行っていますが、重複した日時を出力してしまいます。
実際の日付と時刻の解析は問題ないので、現在2012年6月6日を出力しています。10:45は問題ありませんが、次のように、for-eachのために毎回複製されています。
2012年6月6日
10:45-12:45
セッション1:プレゼンテーション1、プレゼンテーション2
2012年6月6日
10:45-12:45
セッション2:プレゼンテーション3、プレゼンテーション4
2012年6月7日:
8:45-10:45
セッション3:プレゼンテーション5、プレゼンテーション6
私が欲しいのは、どういうわけかすべての一般的な日時を引き出すことです。たとえば、次のような出力を取得します。
2012年6月6日:
10:45-12:45
セッション1:プレゼンテーション1、プレゼンテーション2
セッション2:プレゼンテーション3、プレゼンテーション4
2012年6月7日:
8:45-10:45
セッション3:プレゼンテーション5、プレゼンテーション6
参考までに、現在の実装は次のとおりです。
<xsl:for-each select="session">
<h4>
<!-- output to Month, DD, YYYY -->
<xsl:call-template name="formatDate">
<xsl:with-param name="dateTime" select="@starttime" />
</xsl:call-template>
</h4>
<h5>
<!-- output time -->
<xsl:call-template name="formatTime">
<xsl:with-param name="dateTime" select="@starttime" />
</xsl:call-template> -
<xsl:call-template name="formatTime">
<xsl:with-param name="dateTime" select="@endtime" />
</xsl:call-template>
</h5>
<!-- session title -->
<h5><xsl:value-of select="@name"/></h5>
<!-- presentation title -->
<xsl:for-each select="presentation">
<xsl:value-of select="@name"/><xsl:element name="br"/>
</xsl:for-each>
</xsl:for-each>
そして、日時フォーマッター:
<!-- formatting dateTime -->
<xsl:template name="formatDate">
<xsl:param name="dateTime" />
<xsl:variable name="date" select="substring-before($dateTime, ' ')" />
<xsl:variable name="year" select="substring-before($date, '-')" />
<xsl:variable name="month" select="number(substring-before(substring-after($date, '-'), '-'))" />
<xsl:variable name="day" select="number(substring-after(substring-after($date, '-'), '-'))" />
<!-- output -->
<xsl:choose>
<xsl:when test="$month = '1'">January</xsl:when>
<xsl:when test="$month = '2'">February</xsl:when>
<xsl:when test="$month = '3'">March</xsl:when>
<xsl:when test="$month = '4'">April</xsl:when>
<xsl:when test="$month = '5'">May</xsl:when>
<xsl:when test="$month = '6'">June</xsl:when>
<xsl:when test="$month = '7'">July</xsl:when>
<xsl:when test="$month = '8'">August</xsl:when>
<xsl:when test="$month = '9'">September</xsl:when>
<xsl:when test="$month = '10'">October</xsl:when>
<xsl:when test="$month = '11'">November</xsl:when>
<xsl:when test="$month = '12'">December</xsl:when>
</xsl:choose>
<xsl:value-of select="' '" />
<xsl:value-of select="$day" />
<xsl:value-of select="', '" />
<xsl:value-of select="$year" />
</xsl:template>
<!-- formatting dateTime -->
<xsl:template name="formatTime">
<xsl:param name="dateTime" />
<xsl:value-of select="substring-after($dateTime, ' ')" />
</xsl:template>