Месяц мне не давала покоя мысль, что мои новости на портале оказываются вложенными друг в друга 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>
Для примера ошибки рассмотрим такой код 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:
&nbsp;
 
Самый лучший вариант предложил мой программист: добавить в DIV такой код:
<div class="hidden"> </div>
И разметка не разъедется, и DIV пустой не будет .
Интересная особенность, если мы делаем вот так:
<div class="news_Approve"></div>
то закрывающий тэг не теряется, а если между ними вставить хоть пробел, хоть таб, то закрывающий тег потеряется =)
Update: есть более умный вариант, о котором все забыли:
<xsl:output method="html" />
=))
Update: есть более умный вариант, о котором все забыли:
<xsl:output method="html" />
=))
Комментариев нет:
Отправить комментарий