修改:重构的问题和代码
扩展this question ...
我有一个XML Feed,它以以下格式表示演示文稿的开始和结束时间:2012-06-06 10:45
,每个节点都以这种方式表示:
<session id="9c4716c71f" name="Session 1" starttime="2012-06-06 10:45" endtime="2012-06-06 12:45" location="" chair="">
<article code="c1" id="TT-282" type="presentation"></article>
<article code="c2" id="TT-301" type="presentation"></article>
...
</session>
<session id="9c4716c249z" name="Session 2" starttime="2012-06-06 14:45" endtime="2012-06-06 16:45" location="" chair="">
<article code="c1" id="TT-214" type="presentation"></article>
<article code="c2" id="TT-328" type="presentation"></article>
...
在上一个问题中,我只关心分组,但现在我想在日期(2012年6月6日)对所有这些进行分组。
因此,理想情况下,我的输出首先按日期分组,然后按时间分组(我将在以下代码中显示)。
我有一个模板,我申请显示该部分:
<!-- 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>
我以这种方式应用它:
<h4>
<!-- output DD-MM-YYYY -->
<xsl:call-template name="formatDate">
<xsl:with-param name="dateTime" select="@starttime" />
</xsl:call-template>
</h4>
这是我目前的分组方法。可以看出,它直接在未格式化的日期时间(2012-06-06 10:45
)上进行分组,但我想首先对格式化日期(存储在$cdate
内)进行分组,然后在$ctime
内进行分组。 / p>
<xsl:template match="session">
<xsl:variable name="cdate">
<xsl:call-template name="formatDate">
<xsl:with-param name="dateTime" select="@starttime" />
</xsl:call-template>
</xsl:variable>
<xsl:if test='not(preceding-sibling::session[@starttime = current()/@starttime])'>
<h2><xsl:value-of select="@starttime" /></h2>
<div><xsl:apply-templates /></div>
</xsl:if>
</xsl:template>
<xsl:template match="article">
<b><xsl:value-of select="@name" /></b>
</xsl:template>
所以,目前我看到一个显示在页面上的唯一@startime值的列表。 我真的非常希望看到的输出(我仍在使用XSLT思维模式)是这样的:
June 06, 2012
10:45 - 12:45 | TT-282
| TT-301
----------------------------------
14:45 - 16:45 | TT-214
| TT-328
June 07, 2012
....
我现在关心的是直接格式化,但只是希望能够进行基于变量的这个由两部分组成的分组。绝对赞赏任何和所有的帮助。
答案 0 :(得分:1)
使用XSLT 1.0,您可以使用变量进行两遍转换,然后使用exsl:node-set
之类的扩展函数,例如
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="temp-doc">
<!-- now create the nodes here you want to process later on in a second pass -->
</xsl:variable>
<xsl:key name="k2" match="foo" use="bar"/>
<xsl:template match="/">
<!-- here we are processing the nodes in the variable obtained from the first pass of prcocesssing -->
<xsl:apply-templates select="exsl:node-set($temp-doc)//foo[generate-id() = generate-id(key('k2', bar)[1])]"/>
</xsl:template>
<xsl:template match="foo">...</xsl:template>
</xsl:stylesheet>