Muenchian группировка использует ключ, определенный на корневом уровне листа XSLT, который позволяет функции key
возвращать список всех элементов, которые соответствуют заданным критериям, а затем выбирает первый элемент из этого списка. Например:
<xsl:key name="feedingTime" match="*" use="feeding-time" />
Это позволяет вам вызывать key('feedingTime','11:00')
, чтобы получить список всех элементов, которые имеют элемент feeding-time
со значением 11:00
.
Вы можете использовать это в шаблоне с функцией generate-id()
, которая возвращает уникальное значение каждого идентификатора. Вы делаете это путем сравнения идентификатора элемента, который вы сейчас обрабатываете, с идентификатором первого элемента в списке всех элементов с одинаковым значением feeding-time
. Как это:
<xsl:if test="generate-id(feeding-time) = generate-id(key('feeding-time',feeding-time)[1])">
<!-- generate output -->
</xsl:if>
Или вы можете использовать одно и то же условие в сопоставлении с шаблоном и использовать один и тот же ключ для перебора списка animal
узлов с текущим временем подачи:
<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]">
<!-- output a heading here, current node is first animal node with each feeding-time -->
<xsl:for-each select="key('feedingTime',feeding-time)">
<!-- output each animal here -->
</xsl:for-each>
</xsl:template>
Если вы сделаете это, вам нужно будет включить пустой шаблон, например, такой: <xsl:template match="animal" />
для обработки оставшихся animal
элементов, отбрасывая их; вы уже работали с ними в цикле for-each
вышеприведенного шаблона.
Вы можете использовать режимы шаблонов, чтобы обрабатывать список отдельно для ссылок и содержимого ниже, например:
<xsl:key name="feedingTime" match="*" use="feeding-time" />
<xsl:template match="zoo">
<xsl:apply-templates mode="links" />
<xsl:apply-templates mode="content" />
</xsl:template>
<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]" mode="links">
<a href="#time_{feeding-time}">
<xsl:value-of select="feeding-time" />
</a>
</xsl:template>
<xsl:template match="animal[generate-id() = generate-id(key('feedingTime',feeding-time)[1])]" mode="content">
<p id="time_{feeding-time}">
<xsl:value-of select="concat(feeding-time,' Feeding time for:')" />
</p>
<ul>
<xsl:for-each select="key('feedingTime',feeding-time)">
<li>
<xsl:value-of select="@name" />
</li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="animal" mode="links" />
<xsl:template match="animal" mode="content" />
Два шаблона внизу предназначены для обработки всех элементов animal
, которые не были обработаны предыдущими (т. Е. Вторым и последующим элементом animal
для каждого времени подачи). Я не занимался форматированием здесь, но, надеюсь, он должен продемонстрировать методы, которые должны вам помочь.