неопределенная таблица на XSL

timur-kar

Новичок
неопределенная таблица на XSL

кто-нибудь делал на XML/XSLT таблицу столбцы которой определяются из XML ?

что-то типа
<table>

<columns>
<column>id</column>
<column>name</column>
</columns>

<data>
<item>
<id>1</id>
<name>aaa</id>
<item>
<item>
<id>2</id>
<name>bbb</id>
<item>
</data>
</table>

у меня получилось, но довольно коряво (в плане XSL) , с использованием аттрибутов и переменных (в смысле структура таблицы в XML не такая, а что-то типа
<item>
<field column="id">1</field>
<field column="name">aaa</field>
</item>

есть ли у кого-нибудь решения такой задачи ?
 

Alexandre

PHPПенсионер
я делал,
есть разные варианты решения, например:
Код:
<root>
   <column name="a1">
   <column name="a2">
  <data>
      <items>
          <item name="a1">1</items>
          <item name="a2">2</items>
      <items>
      <items>
          <item name="a1">21</items>
          <item name="a2">22</items>
      <items>
  </data>
</root>
Преобразование состоит из трех частей:
строим колонки таблицы
Код:
<xsl:for-each select="root/colum">
    <xsl:value-of select="name"/>
</xsl:for-each >
строим строки таблиц:
Код:
<xsl:for-each select="root/data/items">
    <xsl:call-template  name="raw">
         <xsl:with-param name="raw" select="."/>
    <xsl:call-template >
</xsl:for-each >
анализируем строку таблицы
делаем перебор по узлам колонок
и выводим совпадающие имена колонок
Код:
<xsl:template name="raw">
    <xsl:paran name="raw"> 
    <xsl:variable name="name" select ="$raw/@name"/>
    <xsl:for-each select="root/colum">
         <xsl:if test="item/@name = $name" >                 
               <xsl:value-of select="item"/>

         </xsl:if>
    </xsl:for-each >
Ну вот в этом направлении надо копать

хотя есть вариант с использованием ключей
 

timur-kar

Новичок
в общем примерно такой вариант у меня и получился, только без использования test
<xsl:value-of select="item[@name=$name]/>
и call-template, там использовал тоже variable

но это довольно коряво (1 - описывать таблицу приходится довольно сложно, 2 - сложное преобразование, неизвестно как поведет себя по скорости на больших объемах данных). вот и спрашиваю - есть ли другие варианты :)
 

Alexandre

PHPПенсионер
хотя есть вариант с использованием ключей
а больших объемах (более 1000 строк) ведет нормально, правда есть некоторая полуторосекундная задержка. Вообще-то надо профайлить, может эта задержка в БД ;)

-~{}~ 30.12.04 17:13:

это довольно коряво
да, но работает :)
 

timur-kar

Новичок
Alexandre
спасибо за ответ

в принципе более 1000 строк задержка в 1.5 сек очень даже небольшая (тем более такие таблицы для моих задач выбирать придется редко).

коряво - это не в смысле кода, а в смысле решения, но другого я тоже не нашел :) а это решение действительно работает поэтому имеет право на жизнь
 

Alexandre

PHPПенсионер
chameleon спец по ключам,

он подскажет решение с ключами.
там более красивое решение.

У меня возникала похожая задача, он мне помог. Но уже Новый Год на носу, Видо - меняет цвет на праздничный :)

Вообще-то в XSLT все решения, связанные с хитрыми сортироваками очень неуклюжи.
 
Сверху