xsl:apply-templates делает output-escaping. Как исправить.

maxru

МИФИст
xsl:apply-templates делает output-escaping. Как исправить.

Ситуация такова:
Есть база по маркам товара. Я забираю xml по товарам (генерирую сам) и запихиваю в xsl-шаблонизатор.
Вот XML:
PHP:
<goods>
<items_on_page>10</items_on_page>
<pages_total>1</pages_total>
<current_page_number>1</current_page_number>
<items_sort_by>good_id</items_sort_by>
<items_sort_direction>ASC</items_sort_direction>
<filters>
</filters>
<good id = "11">
<marking>34234234-23</marking>
<brand>7</brand>
<model>FDE-2</model>
<type>3</type>
<price>135.67</price>
</good>
<parameters>
<brands>
<brand id = "7">
<name>Black &amp;amp; Decker</name>
</brand>
<brand id = "8">
<name>B&amp;amp;S</name>
</brand>
<types>
<type id = "1">
<name>Автомойка</name>
</type>
<type id = "2">
<name>Автопылесос</name>
</type>
</types>
</parameters>
</goods>
Вот фрагмент XSL-шаблона, выводящий список марок:
PHP:
<xsl:template match="/goods">
     <xsl:apply-templates select="parameters/brands">
				<xsl:with-param name="sel" select="./filters/good_brand"/>
			</xsl:apply-templates>
</xsl:template>
<xsl:template match="parameters/brands">
		<select name="filter_brand" id="filter_brand" class="text" onchange="loadGoods()">
			<option value="0">Все</option>
			<xsl:apply-templates select="brand">
				<xsl:with-param name="sel" select="$sel"/>
			</xsl:apply-templates>
		</select>
	</xsl:template>
	
	<xsl:template match="brand">
		<xsl:choose>
			<xsl:when test="$sel = @id">
				<option value="{@id}" selected="selected" style="background-color: red;"><xsl:value-of disable-output-escaping = "yes" select="name"/></option>
			</xsl:when>
			<xsl:otherwise>
				<option value="{@id}"><xsl:value-of disable-output-escaping = "yes" select="name"/></option>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
В итоге получается, что при вызове xsl:apply-templates возвращаемое темплейтом значение все равно экранируется.
То есть &amp; превращается в &amp;amp; (если генерировать список не в отдельном темплейте, а в /goods циклом, то остается &amp; как и было).
Это некритично (в списке марок вместо & стоит &amp;), но выглядит некрасиво.
Как отменить экранирование (или убрать его последствия)?
 

slach

Новичок
если экранирование не критично, тогда чего беспокоитесь???

нормальный ?amp; вместо & - по моему это более грамотное решение
и от всякого XSS ввиде ?quot; вместо " тоже помогает бывает
 

maxru

МИФИст
slach
мне надо не от XSS спасаться, а выпадающем списке вывести
Black & Decker , а не Black & amp; Decker
 

slach

Новичок
option value="Black ?amp; Decker"
нормально должно выводиться

у вас двойное экранирование получается чтоли??
значит смотрите где оно в базе "не так" хранится =)
 

maxru

МИФИст
slach в базе оно "так" хранится. То есть с &.
При генерации XML "&" заменяется на "& amp;" (иначе not well-formed).
Если этот xml отрабатывается в одном <xsl:template></..>, то ничего не экранируется.
Если в этом <xsl:template match="/"></...> вызывается другой <xsl:template match="brands"></...>, например, для генерации списка <option><xsl:value-of disable-output-escaping = "yes" select="brand_name"/></option>, то при завершении отработки по шаблону brands сгенерированный шаблоном код возвращается в / и при этом экранируется.
В общем-то об этом написано на многих сайтах, но написано как факт - да, экранируется.
А как от этого избавиться - не знаю.

-~{}~ 29.08.07 20:59:

ВСЕ, ПАРДОН, ТЕМУ МОЖНО ЗАКРЫВАТЬ.
Ошибка была у меня в ДНК.
Глючил мой класс XMLBuilder. Точнее я сначала делал построение XML для марок (brands), там & экранировалась 1 раз.
Потом при построении XML по товарам я просто прибавлял строку с марками к ноду <parameters>.
В итоге происходило повторное экранирование.
Проблема решилась добавлением в <parameters> дочернего массива, а не готового XML.

Еще раз извините.
 

slach

Новичок
=)) да ладно бывает
но в целом значит я правильно угадал - двойное экранирование было =)
 
Сверху