Форматирование таблиц XML / XSL

Допустим, у меня есть список из 500 имен в тегах XML. Я хочу отобразить этот список в таблице с помощью XSLT. В таблице XSLT я хочу иметь максимум три строки; Меня не волнует, сколько у меня столбцов - я планирую поместить таблицу в прокручиваемый div. Если мой список имен вырастет до 1000, мне по-прежнему нужны только три строки, но количество столбцов может вырасти до любого необходимого размера.

Как я могу сделать это в XSLT? Что касается таблиц XSL, я знаком с xsl: for-each, но это все.

Формат примерно такой:

‹Node1>‹ node2> ‹NAME> data‹ / NAME> ‹NAME> data‹ / NAME> ... ‹/ node2>‹ / node1>


person War Chester Shire Sauce    schedule 20.07.2010    source источник
comment
Каков формат вашего XML? Что вы подразумеваете под таблицей XSL?   -  person Abe Miessler    schedule 20.07.2010
comment
Под таблицей XSL я имел в виду таблицу HTML, отформатированную с помощью XSLT. Спасибо за ссылку ниже, проверю.   -  person War Chester Shire Sauce    schedule 20.07.2010
comment
Хороший вопрос (+1). См. Мой ответ для полного решения.   -  person Dimitre Novatchev    schedule 20.07.2010
comment
Вау! это прекрасно работает! Спасибо!   -  person War Chester Shire Sauce    schedule 21.07.2010


Ответы (2)


Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:variable name="vnumCells" select="count(/*/*/NAME)"/>
 <xsl:variable name="vcellsPerRow"
       select="ceiling($vnumCells div $pnumRows)"/>


 <xsl:template match="node2">
  <table>
    <xsl:apply-templates select="NAME[position() mod $vcellsPerRow = 1]"/>
  </table>
 </xsl:template>

 <xsl:template match="NAME">
  <tr>
    <xsl:apply-templates mode="copy" select=
    ". | following-sibling::*[not(position() >= $vcellsPerRow)]"/>
  </tr>
 </xsl:template>

 <xsl:template match="NAME" mode="copy">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

при выполнении с любым XML-документом указанного формата, например следующего:

<node1>
    <node2>
        <NAME>name1</NAME>
        <NAME>name2</NAME>
        <NAME>name3</NAME>
        <NAME>name4</NAME>
        <NAME>name5</NAME>
        <NAME>name6</NAME>
        <NAME>name7</NAME>
        <NAME>name8</NAME>
        <NAME>name9</NAME>
        <NAME>name10</NAME>
    </node2>
</node1>

дает желаемый результат: таблица с тремя строками, в которой первые две строки имеют одинаковое количество ячеек, а последняя строка может быть короче:

    <table>
   <tr>
      <td>name1</td>
      <td>name2</td>
      <td>name3</td>
      <td>name4</td>
   </tr>
   <tr>
      <td>name5</td>
      <td>name6</td>
      <td>name7</td>
      <td>name8</td>
   </tr>
   <tr>
      <td>name9</td>
      <td>name10</td>
   </tr>
</table>
person Dimitre Novatchev    schedule 20.07.2010

Если вы говорите о преобразовании XML в таблицу HTML с помощью XSLT, я бы рекомендовал взглянуть на эту статью. Он предоставляет несколько шаблонов, которые позволят вам делать то, о чем вы говорите, но, вероятно, потребуется небольшая настройка.

person Abe Miessler    schedule 20.07.2010