Я применяю шаблоны с переменной в атрибуте select, которая содержит часть дерева. Из этого я вызываю еще одно применение шаблонов со строкой next-sibling ::, но это относится ко всему дереву. Например:Почему XSLT меняет контекст неожиданно?
<a>
<b id="1" ol="1" />
<b id="2" ol="0" />
<b id="3" ol="0" />
<b id="4" ol="1" />
<b id="5" ol="0" />
<b id="6" ol="0" />
<b id="7" ol="1" />
<b id="8" ol="0" />
<b id="9" ol="0" />
<b id="10" ol="1" />
<b id="11" ol="0" />
<b id="12" ol="0" />
<b id="13" ol="1" />
<b id="14" ol="0" />
<b id="15" ol="0" />
<b id="16" ol="1" />
</a>
...
<xsl:variable name="part" select="b[@ol = 1] />
<xsl:apply-templates mode="top" select="$part[position() mod 3 = 1]" />
...
<xsl:template mode="top" match="*">
<tr>
<xsl:apply-template mode="inner" select=".|following-sibling::b[not(position() > 2)]" />
</tr>
<xsl:template>
<xsl:template mode="inner" match="*">
<p><xsl:value-of select="@id" /></p>
<xsl:template>
Что я ожидаю
<tr><p>1</p><p>4</p><p>7</p></tr>
<tr><p>10</p><p>13</p><p>16</p></tr>
То, что я получил
<tr><p>1</p><p>2</p><p>3</p></tr>
<tr><p>10</p><p>11</p><p>12</p></tr>
Так почему же шаблон «сверху» контекст изменения, чтобы завершить дерево вместо $part
при применении следующих -sibling? А как получить ожидаемый вариант?
На самом деле мне нужен ответ не так сильно, как мне нужен правильный код, чтобы получить требуемую структуру, описанную выше. –