parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

1/2 OFF вопрос по преобразованию XSLT

ConstC 27.11.2003 18:29

Здравствуйте, есть необходимость сделать следующее преобразование:
Имеется XML файл вида:
============8<==========
<?xml version="1.0" encoding="Windows-1251"?>
<gallery photos_per_row="2" photos_per_column="2" title="My very first gallery" author="Nobody" date="" type="Misc">
	<photos>
		<photo id="0" title="First photo" author="Nobody" date="01.01.2003" descr="This is my first photo" />
		<photo id="1" title="Second shot" author="Nobody" date="02.01.2003" descr="This is my second photo. Isn't it cool?" />
		<photo id="2" title="The last, but not the least" author="Nobody" date="03.01.2003" descr="" />
		<photo id="3" title="4-th photo" author="Nobody" date="01.01.2003" descr="This is my first photo" />
		<photo id="4" title="5-th shot" author="Nobody" date="02.01.2003" descr="This is my second photo. Isn't it cool?" />
		<photo id="5" title="6-th photo" author="Nobody" date="03.01.2003" descr="" />
		<photo id="6" title="7-th photo" author="Nobody" date="03.01.2003" descr="" />
		<photo id="7" title="8-th photo" author="Nobody" date="03.01.2003" descr="" />
	</photos>
</gallery>
============8<==========

необходимо преобразовать в таблицу по 3 ячейки в строку
вида:
============8<==========
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
============8<==========

сделал следующий xsl файл (не уверен в правильности)
============8<==========
<?xml version="1.0" encoding="windows-1251" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="gallery"> 
      <html><head><title><xsl:value-of select="@title" /></title></head> 
      <body><h1 align="center"><xsl:value-of select="@title" /></h1>
	    <table cellspacing="0" cellpadding="3" border="1" bordercolor="#135094" align="center">
	       <xsl:apply-templates select="photos" />
	    </table>
      </body></html> 
   </xsl:template> 

   <xsl:template match="photos"> 
        <tr>
        <xsl:for-each select="photo"> 
		<xsl:choose>
			<xsl:when test="@id mod 4=0">
			{!!!}</tr><tr><td><xsl:value-of select="@title"/><xsl:value-of select="@id"/></td>
			</xsl:when>
			<xsl:otherwise>
			<td><xsl:value-of select="@title"/><xsl:value-of select="@id"/></td>
			</xsl:otherwise>
		</xsl:choose>
        </xsl:for-each> 	
	</tr>
   </xsl:template> 
</xsl:stylesheet>
============8<==========

{!!!} - так вот проблема в том, что
</tr><tr>
естественно не получается, т.к. закрывающий тэг предшествует открывающему.
Как вариант есть мысль в xml файле сделать разбивку на
<section></section>
, но на мой взгляд это не есть gut, т.к. сразу накладывает ограничение на форматирование...

Хочется спросить вашего мнения о возможном решении задачи.