xslt - получить последнюю строку из цикла foreach (разбит на 3 столбца) - PullRequest
1 голос
/ 20 июля 2010

Я перебираю 1-20 <li>, используя xslt, и пытаюсь выяснить, как добавить класс в последнюю строку списка, когда отображается в формате сетки с 3 столбцами.

В настоящее время я использую этот код для добавления класса col-last к каждому третьему столбцу в списке.

<xsl:if test="not(position() mod 3)">
  <xsl:attribute name="class">col-last</xsl:attribute>
</xsl:if>

Есть ли способ добавить класс последней строки в последний ряд, учитывая, что в нем может быть 1-3 элемента?

Пример

4 наименования

<li>Item 1</li>
<li>Item 2</li>
<li class="col-last">Item 3</li>
<li class="row-last">Item 4</li>

5 шт.

<li>Item 1</li>
<li>Item 2</li>
<li class="col-last">Item 3</li>
<li class="row-last">Item 4</li>
<li class="row-last">Item 5</li>

6 предметов

<li>Item 1</li>
<li>Item 2</li>
<li class="col-last">Item 3</li>
<li class="row-last">Item 4</li>
<li class="row-last">Item 5</li>
<li class="row-last col-last">Item 6</li>

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="li">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:variable name="class">
                <xsl:if test="position() > last() - last() mod 3 - 3 * not(last() mod 3)">row-last </xsl:if>
                <xsl:if test="not(position() mod 3)">col-last </xsl:if>
            </xsl:variable>
            <xsl:if test="$class != ''">
                <xsl:attribute name="class">
                    <xsl:value-of select="normalize-space($class)"/>
                </xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С этими входами:

<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
</ul>

<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ul>

<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>

Результаты:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li class="col-last">Item 3</li>
    <li class="row-last">Item 4</li>
    <li class="row-last">Item 5</li>
    <li class="row-last col-last">Item 6</li>
</ul>

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li class="col-last">Item 3</li>
    <li class="row-last">Item 4</li>
    <li class="row-last">Item 5</li>
</ul>

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li class="col-last">Item 3</li>
    <li class="row-last">Item 4</li>
</ul>

Примечание: Когда атрибуты output принимают к сведению, что последний атрибут с тем же именем перезаписывает предыдущий.

1 голос
/ 20 июля 2010

Вы можете использовать другой тест, чтобы увидеть, находится ли position() в пределах 3 от размера набора узлов, используя last()-3:

Этот ответ не полностью отвечает заявленным требованиям. @ Ответ Алехандро должен быть принятым ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...