所以我要做的是从xml中获取日期中所有唯一的Years,然后循环遍历Years以获取该Year的所有结果。下面的代码在一定程度上起作用,但目前它只返回唯一的完整日期,因为我不知道如何通过Date字符串的一部分获得唯一值(前四个字符,例如2012)。我想在xpath中使用子字符串,但我所尝试的一切似乎都失败了。有人知道我应该在这里做什么吗?
因此,我希望返回的第一个结果是这些值201220112010。
这是我在下面使用的代码——使用xslt 1.0。我对xslt工作还比较陌生,所以我可能会错过一些简单的东西。。。
<!-- key at top of document -->
<xsl:key name="product" match="gdr:CompanyHistory/gdr:Event/gdr:Date" use="." />
<xsl:for-each select="gdr:CompanyHistory/gdr:Event/gdr:Date[generate-id()=generate-id(key('product',.)[1])]">
<strong>Year = <xsl:value-of select="substring(., 1, 4)"/></strong>
<ul>
<xsl:variable name="Date" select="."/>
<!-- foreach year get all results that have dates in that year. -->
<xsl:for-each select="gdr:CompanyHistory/gdr:Event[substring(gdr:Date, 1, 4) = $Date]">
<li><xsl:value-of select="gdr:Description" /> - <xsl:value-of select="gdr:Date" /></li>
</xsl:for-each>
</ul>
</xsl:for-each>
xml
<CompanyHistory>
<Event>
<Date>2012-02-16T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2012-02-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2011-03-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2011-04-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2010-01-26T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2010-01-16T00:00:00</Date>
<Description>description</Description>
</Event>
</CompanyHistory>
我希望这有点道理。注意:我缩短了完整的xpath,使它更可读。
我只为年份定义键,然后使用Muenchian分组。所以样式表是
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:key name="year" match="CompanyHistory/Event" use="substring(Date, 1, 4)"/>
<xsl:template match="CompanyHistory">
<xsl:apply-templates select="Event[generate-id() = generate-id(key('year', substring(Date, 1, 4))[1])]" mode="group"/>
</xsl:template>
<xsl:template match="Event" mode="group">
<h2>Year = <xsl:value-of select="substring(Date, 1, 4)"/></h2>
<ul>
<xsl:apply-templates select="key('year', substring(Date, 1, 4))"/>
</ul>
</xsl:template>
<xsl:template match="Event">
<li>
<xsl:value-of select="Description"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="Date"/>
</li>
</xsl:template>
</xsl:stylesheet>
输入
<CompanyHistory>
<Event>
<Date>2012-02-16T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2012-02-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2011-03-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2011-04-01T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2010-01-26T00:00:00</Date>
<Description>description</Description>
</Event>
<Event>
<Date>2010-01-16T00:00:00</Date>
<Description>description</Description>
</Event>
</CompanyHistory>
转化为
<h2>Year = 2012</h2>
<ul>
<li>description - 2012-02-16T00:00:00</li>
<li>description - 2012-02-01T00:00:00</li>
</ul>
<h2>Year = 2011</h2>
<ul>
<li>description - 2011-03-01T00:00:00</li>
<li>description - 2011-04-01T00:00:00</li>
</ul>
<h2>Year = 2010</h2>
<ul>
<li>description - 2010-01-26T00:00:00</li>
<li>description - 2010-01-16T00:00:00</li>
</ul>