XSLT создает таблицу с различным количеством столбцов - PullRequest
1 голос
/ 20 апреля 2010

У меня есть RSS-канал, который мне нужно отобразить в таблице (это одежда из системы интернет-магазина). Изображения в RSS различаются по ширине и высоте, и я хочу сделать таблицу, которая показывает их все. Во-первых, я был бы рад просто показать все элементы в 3 столбцах, но в дальнейшем мне нужно иметь возможность указать через параметр количество столбцов в моей таблице. Я столкнулся с проблемой, показывающей тег tr и исправляющей ошибки, пока это мой Код:

 <xsl:template match="item">
    <xsl:choose>      
      <xsl:when test="position() mod 3 = 0 or position()=1">
        <tr>
          <td>
            <xsl:value-of select="title"/>
          </td>
        </tr>
        </xsl:when>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="title"/>
        </td>
      </xsl:otherwise>
    </xsl:choose>    
  </xsl:template> 

В RSS все теги "item" находятся на одном уровне в xml, и пока мне нужны только заголовки. Кажется, проблема в том, что мне нужно указать начальный тег, а также конечный тег элемента tr и не могу включить в него все 3 элемента, кто-нибудь знает, как это сделать?

1 Ответ

2 голосов
/ 20 апреля 2010

Легко, когда вы немного отступите. Разделите проблему на более мелкие части.

<xsl:param name="numColumns" select="3" />

<xsl:template match="channel">
  <table>
    <!-- all items that start a column have position() mod x = 1 -->
    <xsl:apply-templates 
       select="item[position() mod $numColumns = 1]" 
       mode="tr"
    />
  </table>
</xsl:template>

<xsl:template match="item" mode="tr">
  <tr>
    <!-- all items make a column: this one (.) and the following x - 1 -->
    <xsl:apply-templates 
      select=".|following-sibling::item[position() &lt; $numColumns]"
      mode="td"
    />
  </tr>
</xsl:template>

<xsl:template match="item" mode="td">
  <td>
    <!-- calculate optional colspan for the last td -->
    <xsl:if test="position() = last() and position() &lt; $numColumns">
      <xsl:attribute name="colspan">
        <xsl:value-of select="$numColumns - position() + 1" />
      </xsl:attribute>
    </xsl:if>
    <xsl:value-of select="title"/>
  </td>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...