2017-02-14 15 views
0

Я пытаюсь преобразовать таблицу XML из более крупного проекта в таблицу HTML, и я довольно новичок в этой игре XSLT. Я нашел много материала, но я ничего, что совсем как эту проблему, так что я думал, что я спрашиваю не видел:Элементы обтекания XSLT с одинаковым значением атрибута (таблица с номером attr)

<table name="my table (2 columns)"> 
    <!-- some column headers --> 
    <colhddef colnum="1">This is column 1</colhddef> 
    <colhddef colnum="2">This is column 2</colhddef> 
    <entry row="1" colnum="1">entry 1</entry> 
    <entry row="1" colnum="2">entry 2</entry> 
    <entry row="2" colnum="1">entry 3</entry> 
    <entry row="2" colnum="2">entry 4</entry> 
    <entry row="3" colnum="1">entry 5</entry> 
    <entry row="3" colnum="2">entry 6</entry> 
    <entry row="4" colnum="1">entry 7</entry> 
    <entry row="4" colnum="2">entry 8</entry> 
</table> 

Я ищу, чтобы обернуть каждый набор записей с атрибутами общего ряда с <tr></tr>, и не помешает убедиться, что столбцы расположены в таблице соответствующим образом. Это, наверное, намного проще, чем я это делаю ... но любая помощь очень ценится!

Бонусные баллы: где я могу найти качественные учебные ресурсы для XSLT? Рекомендуемые книги? и т.д?

Еще раз спасибо!

+0

Что касается обучения, смотрите раздел ресурсов в конце http://stackoverflow.com/tags/xslt/info. –

+0

Что касается того, что не нашел что-то подобное, сегодня http://stackoverflow.com/questions/42228190/how-do-i-sort-a-list-of-xml-items-into-rows-for-an-html- таблица, похоже, является одним и тем же требованием с немного другим форматом, поэтому постарайтесь приспособить это, если вы застряли после своей попытки. –

ответ

0

Это может вам начать:

<xsl:template match="table"> 
<table> 
    <xsl:apply-templates select="entry[@colnum='1']"/> 
</table> 
</xsl:template> 

<xsl:template match="entry[@colnum='1']"> 
<xsl:param name='row'><xsl:value-of select='@row'/></xsl:param> 
<tr> 
    <td><xsl:value-of select="."/></td> 
    <xsl:apply-templates select="../entry[@row=$row][@colnum!=1]"/> 
</tr> 
</xsl:template> 

<xsl:template match="entry[@colnum!='1']"> 
<td><xsl:value-of select="."/></td> 
</xsl:template> 

Первый шаблон создает <table></table> и заполнит его выбор только <entry colnum='1'/> узлов из table узла.

Второй шаблон устанавливает параметр $row в значение атрибута row узла <entry colnum='1'/>. Затем он создает контейнер <tr></tr> и добавляет узел <td></td>, содержащий текст этой записи. Наконец, он выбирает entry узлов из родительской таблицы, где атрибут соответствует параметру $rowrow, и атрибут colnum не 1.

Последнего шаблон превращает эти выбранные <entry> узлов, с атрибутом colnum, который не является 1, в a <td></td> узел.

Выход:

<table> 
    <tr> 
    <td>entry 1</td> 
    <td>entry 2</td> 
    </tr> 
    <tr> 
    <td>entry 3</td> 
    <td>entry 4</td> 
    </tr> 
    <tr> 
    <td>entry 5</td> 
    <td>entry 6</td> 
    </tr> 
    <tr> 
    <td>entry 7</td> 
    <td>entry 8</td> 
    </tr> 
</table> 
+0

Спасибо! Я вижу, что мне нужно улучшить стиль функционального программирования для этого проекта. XML-файл, который мне нужен для разбора, достаточно велик, и XSLT легко выйти из-под контроля и дезорганизоваться. Это намного чище, чем мои попытки. – pattersonpatterson