Замена подстроки в строке в XSL-шаблоне

#
Замена подстроки в строке в XSL-шаблоне
После генерации xml-кода некоторые тэги имеют в качестве своего значения текстовую информацию с переносом строк. Необходимо отобразить эти переносы в выходном html как тэги <br/>. Ниже приведен пример xsl-шаблона, к котором жирным шрифтом выделены вызов шаблона, а также сами шаблоны, непосредственно осуществляющие замену символа переноса строки (&#xA; ) на тэг <br>.

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0"/>


     <xsl:template match="/document_list">
       <xsl:apply-templates select="order_list"/>
   </xsl:template>


   <xsl:template match="description">
       <xsl:call-template name="replace"/>
   </xsl:template>


   <xsl:template name="replace" match="text()" mode="replace">
       <xsl:param name="str" select="."/>
       <xsl:param name="search-for" select="'&#xA;'"/>
       <xsl:param name="replace-with">
           <xsl:element name="br"/>
       </xsl:param>

       <xsl:choose>
           <xsl:when test="contains($str, $search-for)">
               <xsl:value-of select="substring-before($str, $search-for)"/>
               <xsl:copy-of select="$replace-with"/>
               <xsl:call-template name="replace">
                   <xsl:with-param name="str"
                   select="substring-after($str, $search-for)"/>
                   <xsl:with-param name="search-for" select="$search-for"/>
                   <xsl:with-param name="replace-with" select="$replace-with"/>
               </xsl:call-template>
           </xsl:when>

           <xsl:otherwise>
               <xsl:value-of select="$str"/>
           </xsl:otherwise>
       </xsl:choose>
   </xsl:template>



   <!-- Шаблон вывода данных о заказе -->
   <xsl:template match="order_list">
          <xsl:apply-templates select="description"/>
   </xsl:template>

</xsl:stylesheet>


Например, данный xsl-шаблон, примененный к xml-коду, имеющему следующий элемент:

<description>Дата доставки: 7.10.
Организация: хостмэйк
Имя получателя: Иванов Иван
Телефон получателя: 123-00-00
</description>

выдаст в качестве результата следующее:

Дата доставки: 7.10.<br>
Организация: хостмэйк<br>
Имя получателя: Иванов Иван<br>
Телефон получателя: 123-00-00<br>
#
Re: Замена подстроки в строке в XSL-шаблоне
Не подскажите, применил данный метод к шаблону обработчика


<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
   
   <!-- Шаблон "ОплатаПриПолучении" -->
   
   <xsl:template match="/document_list">
      <table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
         <tr>
            <td id="shop_navigation">Адрес доставки</td>
            <td>&#x2192;</td>
            <td id="shop_navigation">Способ доставки</td>
            <td>&#x2192;</td>
            <td id="shop_navigation">Форма оплаты</td>
            <td>&#x2192;</td>
            <td id="shop_navigation_current">Данные доставки</td>
         </tr>
      </table>
      
      <h1>Ваш заказ оформлен</h1>
      
      <xsl:apply-templates select="order_list"/>
      
      
      <xsl:choose>
         <xsl:when test="count(items_order) &gt; 0">
            
            <h2>Заказанные товары</h2>
            
            <table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
               <tr class="shop_cart_table_title">
                  <td>Артикул</td>
                  <td>Наименование</td>
                  <td>Количество</td>
                  <td>Цена</td>
                  <td>Сумма</td>
               </tr>
               <xsl:apply-templates select="items_order"/>
               <tr class="shop_cart_table_title">
                  <td colspan="5" align="right">Итого: <xsl:value-of select="order_list/sum"/>&#xA0;<xsl:value-of select="order_list/currency/currency_name"/></td>
               </tr>
            </table>
            
            <p>Через некоторое время с Вами свяжется наш менеджер, чтобы согласовать заказанный товар и время доставки.</p>
         </xsl:when>
         
         <xsl:otherwise>
            <p>
               <b>Заказанных товаров нет</b>
            </p>
         </xsl:otherwise>
      </xsl:choose>
      
      <p>Спасибо за использование услуг нашего магазина.</p>
   <h3><a href="/users/order/">Вернуться к списку заказов</a></h3>
   <h3><a href="/users/">Вернуться в личный кабинет</a></h3>
   <h3><a href="/products/">Вернуться в магазин</a></h3>
   </xsl:template>
   
   <xsl:template match="description">
<xsl:call-template name="replace"/>
</xsl:template>

<xsl:template name="replace" match="text ()" mode="replace">
<xsl:param name="str" select="."/>
<xsl:param name="search-for" select="'&#xA;'"/>
<xsl:param name="replace-with">
<xsl:element name="br"/>
</xsl:param>

<xsl:choose>
<xsl:when test="contains ($str, $search-for)">
<xsl:value-of select="substring-before ($str, $search-for)"/>
<xsl:copy-of select="$replace-with"/>
<xsl:call-template name="replace">
<xsl:with-param name="str" select="substring-after ($str, $search-for)"/>
<xsl:with-param name="search-for" select="$search-for"/>
<xsl:with-param name="replace-with" select="$replace-with"/>
</xsl:call-template>
</xsl:when>

<xsl:otherwise>
<xsl:value-of select="$str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

   

   <!-- Шаблон вывода данных о заказе -->
   <xsl:template match="order_list">
      
      <h2>Данные доставки</h2>
      <p>ФИО: <xsl:value-of select="site_user_fio"/></p>
      <p>E-mail: <xsl:value-of select="site_users_email"/></p>
      <xsl:if test="site_users_phone != ''">
         <p>Телефон: <xsl:value-of select="site_users_phone"/></p>
      </xsl:if>
      <xsl:if test="site_users_fax != ''">
         <p>Факс: <xsl:value-of select="site_users_fax"/></p>
      </xsl:if>
      
      <xsl:variable name="country" select="country_name"/>
      <xsl:variable name="location">, <xsl:value-of select="location_name"/></xsl:variable>
      <xsl:variable name="city">, <xsl:value-of select="city_name"/></xsl:variable>
      <xsl:variable name="city_area">, <xsl:value-of select="city_area_name"/></xsl:variable>
      <xsl:variable name="adres">, <xsl:value-of select="address"/></xsl:variable>
      
      <p>Адрес доставки:&#xA0;
         <xsl:if test="$country != ''">
            <xsl:value-of select="$country"/>
         </xsl:if>
         <xsl:if test="$location != ', '">
            <xsl:value-of select="$location"/>
         </xsl:if>
         <xsl:if test="$city != ', '">
            <xsl:value-of select="$city"/>
         </xsl:if>
         <xsl:if test="$city_area != ', '">
            <xsl:value-of select="$city_area"/>&#xA0;район</xsl:if>
         <xsl:if test="$adres != ', '">
            <xsl:value-of select="$adres"/>
         </xsl:if>
      </p>
      <p>
         <xsl:if test="index != ''">Индекс: <xsl:value-of select="index"/><br/></xsl:if>
      </p>

         <xsl:apply-templates select="description"/>
      
      <p>
         <xsl:if test="delivery_type/type_of_delivery_description != ''">Тип доставки: &#xA0;<xsl:value-of select="delivery_type/type_of_delivery_description"/><br/></xsl:if>
      </p>
      <p>
         <xsl:if test="system_of_pay_description != ''">Способ оплаты: &#xA0;<xsl:value-of select="system_of_pay_name"/></xsl:if>
      </p>
   </xsl:template>
   
   <!-- Данные о товарах -->
   <xsl:template match="items_order">
      
      <xsl:variable name="quantity">
         <xsl:value-of select="order_items_quantity"/>
      </xsl:variable>
      <xsl:variable name="price">
         <xsl:value-of select="order_items_price"/>
      </xsl:variable>
      
      <tr>
         <td>
            <xsl:value-of select="order_items_marking"/>
         </td>
         <td>
            <xsl:choose>
               <xsl:when test="item/path != ''">
                  <a href="http://{//order_list/shop/site_alias_name}{//order_list/shop/shop_path}{item/fullpath}{item/path}/">
                     <xsl:value-of disable-output-escaping="yes" select="order_items_name"/>
                  </a>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:value-of select="order_items_name"/>
               </xsl:otherwise>
            </xsl:choose>
         </td>
         <td>
            <xsl:value-of select="$quantity"/>
            <xsl:value-of select="item/mesure"/>
         </td>
         <td>
            <xsl:value-of select="$price"/>&#xA0;<xsl:value-of select="//order_list/currency/currency_name"/></td>
         <td>
            <xsl:value-of select="$quantity*$price"/>&#xA0;<xsl:value-of select="//order_list/currency/currency_name"/></td>
      </tr>
   </xsl:template>
</xsl:stylesheet>



Идет ругань:

ПРЕДУПРЕЖЕДЕНИЕ: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: compilation error: file /home/www/z113207/adonia/
line 80 element with-param в файле /home/www/z113207/adonia/modules/Xsl/Xsl.class.php (строка 266)
ПРЕДУПРЕЖЕДЕНИЕ: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: The value 'replace-with ' of the attribute 'name' is not a valid QName. в файле /home/www/z113207/adonia/modules/Xsl/Xsl.class.php (строка 266)
ПРЕДУПРЕЖЕДЕНИЕ: XSLTProcessor::transformToDoc() [function.XSLTProcessor-transformToDoc]: No stylesheet associated to this object в файле /home/www/z113207/adonia/modules/Xsl/Xsl.class.php (строка 270)


80cтрока в шаблоне - подчеркнул
ку
#
Re: Замена подстроки в строке в XSL-шаблоне
up
ку
#
Re: Замена подстроки в строке в XSL-шаблоне
Ругань, вероятно, идет на пробел после слова repalce-with, который есть в примере выше (вот только зачем?), но которого нету в вашем шаблоне (и насколько я понимаю его там быть и не должно).
Так что ваш шаблон вполне рабочий.
А вот место и способ его применения оставляют в недоумении.
Вы генерируемый для этой страницы XML смотрели? Там вообще элемент description-то есть? А если есть, то вы точно хотите вывести его содержимое именно в этом месте?
Заказов не беру. Консультирую редко.
Модератор
#
Re: Замена подстроки в строке в XSL-шаблоне
Пробелы в примере поправил, сам сегодня с ними (пробелами) столкнулся
Авторизация