четверг, 31 марта 2011 г.

XSLT не закрывает DIV

Месяц мне не давала покоя мысль, что мои новости на портале оказываются вложенными друг в друга DIV'ами. Новости генеряться в виде XML, на экран выводятся через XSLT преобразования. написано всё верно, должны идти списком, но почему-то в первую новость вкладывается вторая, в которую вложена следующая и т.п.

Для примера ошибки рассмотрим такой код XSLT:
<div class="news_Info">
    <div class="news_Approve">
        <xsl:if test ="Состояние_утверждения != 0" >
            Новость не опубликована!
        </xsl:if>
    </div>
    <div class="news_CreateDate">
        <xsl:value-of select="Создан"/>
    </div>
    <div class="news_Author">
        <xsl:value-of select="Кем_создано"/>
    </div>
</div>

Проблема кроется в том, что если внутри DIV'а класса news_Approve не сработает xsl:if, т.е. не выдаст строку "Новость не опубликована!", то он окажется пустым:
<div class="news_Approve">
    </div>

А такой пустой DIV в браузер попадёт уже без закрывающего тега (вернее тег закрывающий будет, но в самом конце всего списка новостей). 
Решается просто: в каждый DIV, который может быть пустым дописываем по HTML'ому пробелу ( ). Не забываем, что в XSLT нельзя использовать амперсанд, так как он служебный символ. Несколько вариантов написать пробле HTML:
&amp;nbsp;
&#160;

Самый лучший вариант предложил мой программист: добавить в DIV такой код:
<div class="hidden">&#160;</div>
И разметка не разъедется, и DIV пустой не будет .

Интересная особенность, если мы делаем вот так:
<div class="news_Approve"></div>
то закрывающий тэг не теряется, а если между ними вставить хоть пробел, хоть таб, то закрывающий тег потеряется =)

Update: есть более умный вариант, о котором все забыли:
<xsl:output method="html" />
=))

Комментариев нет: