как кодировать альтернативные строки таблицы через XSLT - PullRequest
0 голосов
/ 13 марта 2012

У меня есть структура:

<root>
    <relation type="relation1">
        <entityType1>a</entityType1>
        <entityType2>1</entityType2>
        <entityType2>2</entityType2>
        <entityType2>3</entityType2>
    </relation>

    <relation type="relation2">
        <entityType3>b</entityType3>
        <entityType4>7</entityType4>
        <entityType4>8</entityType4>
        <entityType4>9</entityType4>
    </relation>

    <relation type="relation3">
        <entityType5>c</entityType3>
        <entityType6>10</entityType4>
        <entityType6>11</entityType4>
        <entityType6>12</entityType4>
    </relation>
</root>

Мне нужно преобразовать через XSLT в таблицу HTML, которая содержит:

<table>
    <tr class="odd"><td>
        a --> 1
    </td></tr>

    <tr><td>
        a --> 2
    </td></tr>

    <tr class="odd"><td>
        a --> 3
    </td></tr>

    <tr><td>
        b --> 7
    </td></tr>

    <tr class="odd"><td>
        b --> 8
    </td></tr>

    <tr><td>
        b --> 9
    </td></tr>

    <tr class="odd"><td>
        c --> 10
    </td></tr>

    <tr><td>
        c --> 11
    </td></tr>

    <tr class="odd"><td>
        c --> 12
    </td></tr>
</table>

Обратите внимание на нечетные / четные чередования строк таблицы,Мне нужно также закодировать их через XSLT.Возможно?

Основной вопрос на самом деле, как я могу сохранить переменную индекса, чтобы указать, является ли текущая строка нечетной или четной при анализе этой структуры.Этого было бы достаточно, чтобы решить эту проблему, потому что в настоящее время у меня есть ... для двух типов отношений, а затем я выполняю итерацию через for-each overlation1 / entityType2 и другую для for-each over ratio2 / entityType4.

Спасибо!

UPDATE-1:

Обратите внимание, что результирующая таблица выполняет итерации по XML-элементам относительности1 и реляции2 и должна каким-то образом поддерживать глобальный индекс, который выполняется между обоими типами отношений, чтобы правильноустановить нечетный / четный класс при завершении итерации отношение1 и переходе к отношению 2.

ОБНОВЛЕНИЕ-2:

В настоящее время у меня есть код, похожий на этот, но я не знаю, как легко рефакторингэто обработать установку class = "odd" на tr.Шаблоны Display_Relation в настоящее время отображают текст для отношений.

<xsl:template match="relation">
        <xsl:choose>
            <xsl:when test="contains(@xsi:type, 'relation1')">
                <xsl:for-each select="entityType2">
                    <tr><td>
                        <xsl:call-template name="Display_Relation1">
                            <xsl:with-param name="source" select="../entityType1/text()"/>
                            <xsl:with-param name="destination" select="./text()"/>
                        </xsl:call-template>
                    </td></tr>
                </xsl:for-each>
            </xsl:when>

            <xsl:when test="contains(@xsi:type, 'relation2')">
                <xsl:for-each select="entityType4">
                    <tr><td>
                        <xsl:call-template name="Display_Relation2">
                            <xsl:with-param name="source" select="../entityType3/text()"/>
                            <xsl:with-param name="destination" select="./text()"/>
                        </xsl:call-template>
                    </td></tr>
                </xsl:for-each>
            </xsl:when>

            <xsl:when test="contains(@xsi:type, 'relation3')">
                <xsl:for-each select="entityType6">
                    <tr><td>
                        <xsl:call-template name="Display_Relation3">
                            <xsl:with-param name="source" select="../entityType5/text()"/>
                            <xsl:with-param name="destination" select="./text()"/>
                        </xsl:call-template>
                    </td></tr>
                </xsl:for-each>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Попробуйте что-то вроде этого ...

<tr>
  <xsl:if test="boolean((count(preceding::*[parent::relation]) + 1) mod 2)">
    <xsl:attribute name="class">odd</xsl:attribute>
  </xsl:if>
  <xsl:apply-templates/>
</tr>

Предполагается, что текущий контекст равен *[parent::relation] (entityType1, entityType2 и т. Д.), Однако ключевым элементом является использование preceding::ось.

Если вы хотите, вы также можете использовать что-то вроде preceding::*[starts-with(name(),'entityType')] вместо preceding::*[parent::relation].

1 голос
/ 13 марта 2012

Вы можете легко это сделать.Если вы перебираете дочерние элементы вашего первого <relation>, используя <xsl:for-each>, вы можете использовать функцию position(), чтобы получить номер строки, а затем проверить его на нечетность.

<xsl:for-each select="relation[@type='relation1']/*">
<tr>
<xsl:if test="position() mod 2 = 1">
  <xsl:attribute name="class">odd</xsl:attribute>

<!-- etc. -->

</tr>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...