XSL, спецсимволы в атрибутах

crocodile2u

http://vbolshov.org.ru
XSL, спецсимволы в атрибутах

В значении атрибута может встречаться "&lt;", например <element attribute="text&lt;text"/>

После трансформации хочется получить уже не "text&lt;text", а "text<text". А вот как это сделать, пока не пойму. disable-output-escaping не помог.
 

booter

Новичок
Хм, странно, с disable-output-escaping должно как раз работать? А принципиально значение класть в атрибут?
 

crocodile2u

http://vbolshov.org.ru
2 ALL: вопрос снят. Это я сам протупил: переменную обозвал также, как атрибут и не поставил disable-output-escaping _везде_, где было нужно... Сегодня вернулся к этому вопросу, посмотрел свежим глазом и разобрался...
 

baskervilley

Новичок
Автор оригинала: crocodile2u
2 ALL: вопрос снят. Это я сам протупил: переменную обозвал также, как атрибут и не поставил disable-output-escaping _везде_, где было нужно... Сегодня вернулся к этому вопросу, посмотрел свежим глазом и разобрался...
А как выбирались эти атрибуты с использованием <xsl:text>?
У меня похоже та же проблема
Upd:то есть у меня в xml-файле узлы содержат спецсимволы
<node>&lt;strong&gt;next mode &lt;/strong&gt; </node>
а получить надо после преобразования
<strong>next mode</strong>
 

Freeman

Новичок
А у меня такая проблемка: генерирую xml-ку для дальнейшего использования во флешке. Одно из полей должно содержать html-разметку (в частности, <p>, <br>, <font> и т.д.). Структура xml примитивна
<?xml version="1.0"?>
<root>
<now>
<name attr="Название"/>
<html attr="Текст, содержащий тэги"/>
</now>
</root>

Выгружаю информацию из базы следующим образом:

PHP:
$dom = domxml_new_doc("1.0");
$root = $dom->append_child($dom->create_element("root"));
$res = $Ctrl->GetItems();
if ($res)
	foreach($res as $t)
	{
		$news = $root->append_child($dom->create_element("now"));
		$node = $news->append_child($dom->create_element("name"));
		$node->set_attribute("attr",  iconv("ISO-8859-1", "utf-8", $t->name));
		$node = $news->append_child($dom->create_element("html"));
		$node->set_attribute("attr", iconv("ISO-8859-1", "utf-8", $t->text));
	}
	$dom->dump_file($config["xml"]."now.xml", false, true);
При этом все теги заменяются на HTML сущности. Можно ли это как-то обойти, не заморачивась с XSLT-преобразованием (причина банальна: разбираться с ним времени нет, да и не уверен, будет ли его поддержка на хостинге).
Версия PHP 4.3.6

-~{}~ 25.11.05 08:54:

Пришлось таки начать разбираться:)
С поддержкой XSLT разобрался, на хостинге все есть. Теперь осталось разобраться с самим xslt-преобразованием. Вот что у меня получилось в результате чтения FAQ и форум:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="xml" encoding="utf-8" indent="no"/>
<xsl:template match="now">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="now()">
<xsl:value-of select="html" disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>

Предполашалась следующая логика: если это не тег now, то выводим as is, иначе для тега html в теге now объявляем DOE=yes. Но вот только что-то не работает оно... Подскажите, где ошибаюсь? Заранее, сенк

-~{}~ 25.11.05 15:35:

Покопался еще в xslt, почитал форум, FAQ и detail... Понял, что писал фигню:) Не исключено, что и сейчас пишу фигню...
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="xml" />
<xsl:template match="/">
<root>
<xsl:apply-templates select="now"/>
</root>
</xsl:template>

<xsl:template match="now" />
<now>
<xsl:apply-templates select="name"/>
<xsl:apply-templates select="html"/>
</now>
<xsl:template match="name">
<xsl:value-of select="name" disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="html">
<xsl:value-of select="html" disable-output-escaping="yes" />
</xsl:template>
</xsl:stylesheet>

Теперь проблема в том, что ругается:
Warning: Sablotron error on line 1: XML parser error 4: not well-formed (invalid token)

Warning: xslt_error(): supplied argument is not a valid XSLT Processor resource

Конечный файл пытаюсь получить следующим образом:
PHP:
$xslt = xslt_create();
$ret = xslt_process($xslt, $config["xml"]."now.xml", $config["xml"]."now.xsl", $config["xml"]."now1.xml");
$config["xml"]."now.xml" - файл, подготовленный с помощью domxml (писал выше код)
$config["xml"]."now.xsl" - нарисовал ручками, текст привел чуть выше
Sablotron ставил так, как описано в факе (под win32). phpinfo() говорит, что все enable и работает...
 

chameleon

Новичок
тебе ясно указано что файл not well-formed. Ты его ручками в блокноте пишешь чтоли? после "now" должен закрываться "xsl:template"
 

Freeman

Новичок
Автор оригинала: chameleon
тебе ясно указано что файл not well-formed. Ты его ручками в блокноте пишешь чтоли? после "now" должен закрываться "xsl:template"
Сорри, это уже и сам заметил... Просто сообщение для редактирования недоступно:(
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="xml" />
<xsl:template match="/">
<root>
<xsl:apply-templates select="now"/>
</root>
</xsl:template>

<xsl:template match="now">
<now>
<xsl:apply-templates select="name"/>
<xsl:apply-templates select="html"/>
</now>
</xsl:template>
<xsl:template match="name">
<xsl:value-of select="name" disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="html">
<xsl:value-of select="html" disable-output-escaping="yes" />
</xsl:template>
</xsl:stylesheet>

Но ошибка тем не менее осталась... И почему XSLT Processor not valid?
P.S. По поводу блокнота: почти что так. Редактирую в UltraEdit (единственный софт, который более-менее понимает xsl у меня - Visual Studio .NET. Но грузить студию ради 10 строк неохота. Может, есть какие-то сторонние редакторы xsl с подсветкой синтаксиса?)
 
<xsl:template match="html">
<xsl:value-of select="html" disable-output-escaping="yes" />
</xsl:template>

Думаю, имелось в виду
<xsl:template match="html">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
 

Freeman

Новичок
Алексей, согласен, ошибся.
Но все равно остается ошибка:
Warning: Sablotron error on line 1: XML parser error 4: not well-formed (invalid token)...
На всякий случай привожу xml-файл (сгенерированный с помощью domxml):
PHP:
<?xml version="1.0"?>
<root>
  <now>
    <name attr="&#xC1;&#xE5;&#xEB;&#xFB;&#xE9; &#xEB;&#xE5;&#xE1;&#xE5;&#xE4;&#xFC;"/>
    <html attr="&#xD2;&#xE5;&#xEA;&#xF1;&#xF2; &#xEE; &lt;strong&gt;&#xED;&#xEE;&#xE2;&#xEE;&#xF1;&#xF2;&#xF0;&#xEE;&#xE9;&#xEA;&#xE5;&lt;/strong&gt; &lt;em&gt;&#xB9; 1&lt;/em&gt;"/>
  </now>
  <now>
    <name attr="&#xCD;&#xEE;&#xE2;&#xEE;&#xF1;&#xF2;&#xF0;&#xEE;&#xE9;&#xEA;&#xE0; 2"/>
    <html attr="&lt;p&gt;&#xEA;&#xE2;&#xEF;&#xFB;&#xF3;&#xEA;&#xEF;&#xE5;&#xF4;&#xE2;&#xEF;&#xEA;&#xE2;&#xEF;&#xE2;&lt;/p&gt;&#13;&#10;&lt;p&gt;&#xFB;&#xE2;&#xEA;&#xEF;&#xFB;&#xE2;&#xEF;&#xE0;&#xFB;&#xE2;&#xEF;&#xFB;&#xE2;&#xE0;&#xEF;&#xF3;&#xEA;&lt;/p&gt;&#13;&#10;&lt;p&gt;&#xF3;&#xFB;&#xEA;&lt;strong&gt;&#xE5;&#xF6;&#xF3;&#xEA;&#xE5;&#xE0;&#xF7;&#xE2;&#xEF;&#xF0;&#xFB;&#xF3;&#xEA;&lt;/strong&gt;&#xE5;&#xF3;&lt;/p&gt;&#13;&#10;&lt;p&gt;&#xF4;&#xF6;&#xF3;&#xE5;&#xEA;&#xF4;&lt;font color=&quot;#ff0000&quot;&gt;&#xFB;&#xF3;&#xEF;&#xE0;&#xF7;&#xE2;&#xEF;&#xE8;&#xEC;&#xE2;&#xFB;&#xE0;&lt;/font&gt;&#xE5;&#xEF;&#xFB;&#xEA;&#xE2;&#xEF;&lt;/p&gt;"/>
  </now>
</root>
 
Сверху