disable-output-escaping или как жить дальше....

mcfun

Guest
disable-output-escaping или как жить дальше....

Не получается и всё тут, а очень-очень надо. Возможно ли это в PHP5+XSLT?

Пробовал
PHP:
<xsl:text disable-output-escaping="yes">&lt;&gt;&amp;</xsl:text>
Это работает, но, во-первых, очень неудобно писать так большие объёмы кода, а, во-вторых, если передать результат сей манипуляции в качестве xsl:with-param то работать это перестаёт - на выходе всё равно имеем ссылки на сущьности вместо символов.

Кроме того пробовал:
PHP:
<xsl:text disable-output-escaping="yes"><![CDATA[<>&]]></xsl:text>
Это вообще не работает.
Есть ли решение? А то уже действительно постепенно прихожу к выводу что заморачиваться с XML в PHP не стоит свеч, ибо как не нахваливают, а со спецификациией от W3C оно местами расходится.
 

crocodile2u

http://vbolshov.org.ru
<!ENTITY lt CDATA "&amp;#60;" -- знак меньше, U+003C ISOnum -->
<!ENTITY gt CDATA "&amp;#62;" -- знак больше, U+003E ISOnum -->
 

mcfun

Guest
Автор оригинала: crocodile2u
<!ENTITY lt CDATA "&amp;#60;" -- знак меньше, U+003C ISOnum -->
<!ENTITY gt CDATA "&amp;#62;" -- знак больше, U+003E ISOnum -->
Поясните для тупых пожалуйста, как это есть и каков будет эффект
 

mcfun

Guest
Автор оригинала: chameleon
2mcfun
а на выходе что получаешь? HTML?

поделись зачем, чтобы я такого по незнанию не захотел ;)..
На выходе, да - HTML.

Всё просто - хочу на XSL сделать не просто один большой шаблон для XML дерева, а несколько более продуманную весчь - ТЕМА ОФОРМЛЕНИЯ называется, может я конечно изобретаю велосипид, но такого решения я пока нигде не видел.

Т.е. пишется шаблон вида:
PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:value-of select="$header"/></div>
  <div class="block-body"><xsl:value-of select="$body"/></div>
</xsl:template>
Делается кучка таких шаблонов которые все вместе представляют из себы ТЕМУ - т.е. набор именованых шаблонов которые можно использовать в качестве "кирпичиков".(например кирпичики для отображения блоков, полей ввода, элементов списка, итд)

Шаблоны представления модулей могут использовать эти кирпичики:
PHP:
<xsl:template name="authModule">
   <xsl:call-template name="block">
     <xsl:with-param name="header">Вход для пользователей</xsl:with-param>
     <xsl:with-param name="body"><input type="text" name="login"/></xsl:with-param>
   </xsl:call-template>
</xsl:template>
Собственно затык у меня вышел именно на том, что в качестве <xsl:with-param> не может выступать кусок результирующего дерева - в данном случае это тег <input/>, xslt-парсер в PHP5 понимает в качеству <xsl:with-param> только текст :( хотя спецификация предусматривает то, что я пытался сделать(даже в умной книге по XSLT было выделено, что XSLT 1.0 предусматривает такое копирование а в 1.1 оно уже запрещено).

Собственно без того подхода который я выбрал, шаблонизатор на основе XML+XSL превращается в геморрой, и как тут замечали некоторые люди - неоправданный. Поскольку если убрать из модели понятие ТЕМА - то мне либо прямо при генерации DOM-дерева надо будет делать нечто типа createElement('li','элемент списка'), а затем молотить это через xsl:apply-templates, что ИМХО идеологически неверно. Или же придётся делать огромный XSL-шаблон с кучей повторений типа:
<li style="bla-bla-bla"><xsl:value-of select="bla-bla-bla"></li> что есть рутина и как следствие - вероятность ошибки.

Вообще буду очень рад если кто подскажет куда смотреть, а лучше с живыми примерами типа XML дерево такое-то, а XSL шаблон такой-то, и алгоритм вкраце такой-то. Желательно из реально работающего где-то движка.
 

olpa

Новичок
Попробуйте

PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:value-of select="$header"/></div>
  <div class="block-body"><xsl:value-of select="$body"/></div>
</xsl:template>
заменить на

PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:copy-of select="$header"/></div>
  <div class="block-body"><xsl:copy-of select="$body"/></div>
</xsl:template>
 

mcfun

Guest
Автор оригинала: olpa
Попробуйте

PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:value-of select="$header"/></div>
  <div class="block-body"><xsl:value-of select="$body"/></div>
</xsl:template>
заменить на

PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:copy-of select="$header"/></div>
  <div class="block-body"><xsl:copy-of select="$body"/></div>
</xsl:template>
Огромное спасибо! Это работает.
 

chameleon

Новичок
Автор оригинала: mcfun
На выходе, да - HTML.
Всё просто - хочу на XSL сделать не просто один большой шаблон для XML дерева, а несколько более продуманную весчь - ТЕМА ОФОРМЛЕНИЯ называется, может я конечно изобретаю велосипид, но такого решения я пока нигде не видел.
ты хочешь именно за одну трансформацию это сделать? может лучше сделать что-то вроде xml-pipelining? посмотри cocoon, например.
 

mcfun

Guest
Автор оригинала: chameleon
ты хочешь именно за одну трансформацию это сделать? может лучше сделать что-то вроде xml-pipelining? посмотри cocoon, например.
А чем плохо за одну трансформацию? А прикручивать ещё одну перделку к апачу не хочется, зачем если и так всё красиво получается?
 

chameleon

Новичок
Автор оригинала: mcfun
А чем плохо за одну трансформацию? А прикручивать ещё одну перделку к апачу не хочется, зачем если и так всё красиво получается?
а тем, что у тебя теряется гибкость. Поскольку нет доступа к результирующему дереву, то не все задуманное, ИМХО, можно уложить в одну трансформацию на XSLT1.0. По поводу ссылки: к апачу прикручивать ничего не надо, оттуда можно просто концепцию перенять (что, правда, давно уже сделали Krysalis и Popoon :)..
 

mcfun

Guest
Автор оригинала: chameleon
а тем, что у тебя теряется гибкость. Поскольку нет доступа к результирующему дереву, то не все задуманное, ИМХО, можно уложить в одну трансформацию на XSLT1.0. По поводу ссылки: к апачу прикручивать ничего не надо, оттуда можно просто концепцию перенять (что, правда, давно уже сделали Krysalis и Popoon :)..
А можно поподробнее? Я пока не понимаю, где у меня теряется гибкость и почему у меня нет доступа к результирующему дереву.
 

chameleon

Новичок
Я пока не понимаю, где у меня теряется гибкость
если ты просто декорируешь конечные литеральные элементы то такое наверное не потребуется, но если понадобится например:
PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:apply-templates select="$header"/></div>
  <div class="block-body"><xsl:apply-templates select="$body"/></div>
</xsl:template>
такое в XSLT1.0 не пройдет потому как nodeset нужен для этого, достигается либо трасформацией в несколько проходов, либо использованием расширений ala msxml:node-set
 

mcfun

Guest
Автор оригинала: chameleon
если ты просто декорируешь конечные литеральные элементы то такое наверное не потребуется, но если понадобится например:
PHP:
<xsl:template name="block">
  <xsl:param name="header"/>
  <xsl:param name="body"/>
  <div class="block-header"><xsl:apply-templates select="$header"/></div>
  <div class="block-body"><xsl:apply-templates select="$body"/></div>
</xsl:template>
такое в XSLT1.0 не пройдет потому как nodeset нужен для этого, достигается либо трасформацией в несколько проходов, либо использованием расширений ala msxml:node-set
Вот теперь я понял о чем речь. На самом деле у меня то же самое достигается за счёт вложенных call-template. Т.е. когда в with-param одного шаблона передаётся результат вызова другого call-template и вроде как ничего работает.
 
Сверху