Эта таблица стилей дает желаемый результат:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="my:ns">
<xsl:key name="byMonthYear" match="BlogPosts/Post"
use="substring-after(PublishedDate, '/')" />
<ns:months>
<m id="01">January</m>
<m id="02">February</m>
<m id="03">March</m>
<m id="04">April</m>
<m id="05">May</m>
<m id="06">June</m>
<m id="07">July</m>
<m id="08">August</m>
<m id="09">September</m>
<m id="10">October</m>
<m id="11">November</m>
<m id="12">December</m>
</ns:months>
<xsl:variable name="months" select="document('')/*/ns:months/*" />
<xsl:template match="/">
<ul><xsl:apply-templates /></ul>
</xsl:template>
<xsl:template match="BlogPosts/Post" />
<xsl:template
match="BlogPosts/Post[generate-id()=generate-id(key('byMonthYear',
substring-after(PublishedDate, '/'))[1])]">
<xsl:variable name="year"
select="substring-after(
substring-after(PublishedDate, '/'), '/')" />
<xsl:variable name="month"
select="substring-before(
substring-after(PublishedDate, '/'), '/')" />
<xsl:variable name="monthName" select="$months[@id=$month]" />
<h3>
<xsl:value-of select="concat($monthName, ' ', $year)" />
</h3>
<xsl:apply-templates
select="key('byMonthYear', substring-after(PublishedDate, '/'))"
mode="titles" />
</xsl:template>
<xsl:template match="BlogPosts/Post" mode="titles">
<li>
<xsl:value-of select="concat(Title, ' - ', PublishedDate)" />
</li>
</xsl:template>
</xsl:stylesheet>
Мы группируем по месяцам и годам и используем справочную таблицу для перевода цифр месяца в соответствующее имя. Обратите внимание на использование substring-before
и substring-after
для анализа даты.
В примечании к педантику списки HTML не могут содержать элементы, отличные от <li>
, поэтому желаемый вывод не является допустимым HTML.