Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > построить table по тегам с одинаковыми name


Автор: 4epT 21.3.2012, 13:32
Добрый день. Имеется xml документ вида:

Код

...
<tagname1 id="1" rownum="1">value1</tagname1>
<tagname1 id="2" rownum="2">value2</tagname1>
<tagname2 id="3" rownum="1">value3</tagname2>
<tagname2 id="4" rownum="2">value4</tagname2>
<tagname3 id="5" rownum="1">value5</tagname3>
<tagname3 id="6" rownum="2">value6</tagname3>
...


Нужно построить таблицу вида:

Код

<table>
<tr>
<td rowspan="2">
      Title
</td>
<td rowspan="2">
</td>
<td>
tagname1_1 (_1 - ознчает id элемента)
</td>
<td>
tagname2_3 (_3 - ознчает id элемента)
</td>
<td>
tagname3_5 (_5 - ознчает id элемента)
</td>
</tr>
<tr>
<td>
tagname1_2 (_2 - ознчает id элемента)
</td>
<td>
tagname2_4 (_4 - ознчает id элемента)
</td>
<td>
tagname3_6 (_6 - ознчает id элемента)
</td>
</tr>
</table>


Проблема в том что они все лежат на одном уровне, делаю for-each могу пройтись по всем тегам с одиним name, но нужно так же добавить в строку теги с другим name. Эти теги расположены в куче с другими тегами.

Подскажите как можно решить данную проблему ? или в какую сторону гуглить ? заранее спасибо

Автор: diadiavova 21.3.2012, 15:56
Я честно говоря, не понял по какому принципу их делить надо.

Добавлено через 18 секунд
Может потом посмотрю, но лучше объясни подробнее.

Автор: 4epT 21.3.2012, 16:02
Попробую подробнее описать)

Есть набор тегов:

Код

C1
C1
C1
A2
A2
A2
B3
B3
B3


Это нужно записать в таблицу:

Код

С1 - А2 - В3
С1 - А2 - В3
С1 - А2 - В3


Сейчас пытаюсь сделать это именованными шаблонами + рекурсия. 

Автор: diadiavova 21.3.2012, 16:11
Цитата(4epT @  21.3.2012,  17:02 Найти цитируемый пост)
Сейчас пытаюсь сделать это именованными шаблонами + рекурсия.  

Та не, это лишнее. Можно ведь подсчитывать количество предшественников, то есть если тегу T1 предшествует ноль таких же тегов, то он в первую строку идет, один - во вторую и так далее. Это ж простое выражение T1[count(preceding-sibling::T1) = 0] это пойдет в первую строку и т. д. Можно выражением count(preceding-sibling::T1) + 1 вычислять номер строки. Ну и для других тегов и строк все аналогично.

Автор: 4epT 21.3.2012, 16:15
У меня не много опыта в xslt ... можно немного подробнее ?)

Дело в том что строк может быть N штук ... тут как по мне без рекурсии не обойтись

Ну и все это ведь нужно оформить html, что бы каждый тег попал в свою tr и в конкретную td

Автор: diadiavova 21.3.2012, 16:34
Цитата(4epT @  21.3.2012,  17:15 Найти цитируемый пост)
Дело в том что строк может быть N штук ... тут как по мне без рекурсии не обойтись

Ну например ты обходишь все элементы С1 в данном наборе и для каждого создаешь строку. В этой строке у тебя будет в первой ячейке С1, во второй - А1 при этом надо брать именно тот из них, которму предшествует столько же А1, сколько С1 предшествует текущему С1
Код

<xsl:for-each select="C1">
    <xsl:variable name="current" select="." />
    <tr>
        <td><xsl:value-of select="." />
    </tr>
    <tr>
        <td><xsl:value-of select="A1[count(preceding-sibling::A1) = count($current/preceding-sibling::C1)]" />
    </tr>
    <tr>
        <td><xsl:value-of select="B1[count(preceding-sibling::B1) = count($current/preceding-sibling::C1)]" />
    </tr>
</xsl:for-each>

 
Примерно что-то в этом роде. Только там в валью-офах выражение просто для нужного тега, а тебе видимо из него надо еще что-то извлекать. Короче разбери этот пример, там все не сложно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)