Я не думаю, что вам нужен ключ здесь, если вы используете постоянное значение для поиска.Простая переменная будет делать
<xsl:variable name="participants" select="//Participant" />
Затем, чтобы выбрать первого участника для каждой страницы, сделайте это (аналогично одной из ваших закомментированных строк)
<xsl:apply-templates select="$participants[(position() mod $groupSize) = 1]" mode="page"/>
Затем, чтобы получитьучастники на странице делают это ...
<xsl:apply-templates select=".|following::Participant[position() < $groupSize]" mode="item">
Обратите внимание на использование following
вместо following-sibling
, потому что, хотя вы могли выбрать участника из переменной (или ключа), когда вы используетеоператор оси, такой как following-sibling
, он ссылается на узлы в реальном документе, а не только на узлы в переменной / ключах.(following-sibling
получит только участников с тем же родителем, что и выбранный).
Попробуйте это XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="participants" select="//Participant" />
<xsl:variable name="groupSize" select="4" />
<xsl:template match="/">
<document>
<pages>
<xsl:apply-templates select="$participants[(position() mod $groupSize) = 1]" mode="page"/>
</pages>
</document>
</xsl:template>
<!--Page-->
<xsl:template match="*" mode="page">
<xsl:variable name="PageNumber" select="position()" />
<page key="{$PageNumber}">
<xsl:apply-templates select=".|following::Participant[position() < $groupSize]" mode="item">
<xsl:with-param name="PageNumber" select="$PageNumber"/>
</xsl:apply-templates>
</page>
</xsl:template>
<!--Tickets-->
<xsl:template match="*" mode="item">
<xsl:param name="PageNumber"/>
<ticket key="{$PageNumber}-{position()}">
<xsl:value-of select="Name"/>
</ticket>
</xsl:template>
</xsl:stylesheet>