DOM XML/XSLT и одиночные тэги

  • Автор темы TheBits
  • Дата начала

TheBits

Guest
DOM XML/XSLT и одиночные тэги

Здравствуйте.

Модуль DOM XML при XSLT трансформации никогда не делает одиночных тэгов. Всегда появляются <br></br> или <hr></hr> и т.д.

Как от этого избавится?

Спасибо за внимание.
 

TheBits

Guest
В том то и дело что написано <br/> и <hr/>...

Заметил я это когда у меня тэги meta и link приняли вид <meta></meta> и<link></link> соответственно...

Кстате в модуле xslt (если трансформацию производить через xslt_process) всё нормально...

PHP 4.3.10, Apache 2, Windows XP.
 

TheBits

Guest
Нет!

<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/TR/xhtml1/strict"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:eek:utput
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
encoding="UTF-8"
indent="yes"
method="xml"
omit-xml-declaration="no"
version="1.0"
media-type="text/xml"
/>

:)

Могу я узнать как силньо загружает xslt трансформация процессор? Хостер сказал что на моём тарифном плане сильно нельзя...
 

maxim

Новичок
Если файлы небольшие то не очень. Я пользуюсь на валуехосте DOMXML

$xsl = domxml_xslt_stylesheet_doc ($xsl);
$result = $xsl->process($xml);
 

TheBits

Guest
Да. Дома Р4 (2,4 Ghz, Hyper-Threading). При обработке XML файла размером в 140кб нагрузка на процессоры (в сумме) колебалась в районе 50%. Длилось около 5 сек.

А насчёт XSLT — попробую договориться с хостером на установку модуля XSLT (Sablotron)&hellip;
 

TheBits

Guest
Такой скрипт:

PHP:
<?php
//Для расчёта времени.
list($time,$ms) = explode(" ", microtime());
$first_time = $time + $ms;
//

$xml = file_get_contents('example.xml');
$xsl = file_get_contents('power.xsl');


$dom = domxml_open_mem($xml);
$xslt = domxml_xslt_stylesheet($xsl);
$final = $xslt->process($dom);
echo $xslt->result_dump_mem($final);

//----------

$arguments = array(
	'/_xml' => $xml,
	'/_xsl' => $xsl
);

$xh = xslt_create();

$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
if ($result) {
	echo $result;
} else {
	echo "ERROR";
}
xslt_free($xh);


//Расчёт времени
list($time,$ms) = explode(" ", microtime());
$second_time = $time + $ms;
$loaded = $second_time - $first_time;
echo $loaded;//Время работы скрипта
?>
Соответствующие куски кода, которые выполняют трансформацию, коментировал.
XML файл размером 220кб. XSLT таблица не очень сложная ;). Кусок XSLT таблицы я уже приводил выше&hellip;

Результаты такиие:
Libxslt
5,7716059684753 с
5,695081949234 с
5,6948549747467 с
5,6630082130432 с
5,6673798561096 с
6,0866010189056 с
5,6766979694366 с
<t> = 5,75 с

Sablotron
5,8141849040985
5,8878300189972
6,065929889679
5,8252441883087
5,8118641376495
5,831444978714
5,8402149677277
<t> = 5,86 c

По поводу пустых тэгов нашел вот это: http://mail.gnome.org/archives/xslt/2003-May/msg00050.html.
Правда ничего не понял. ;)

-~{}~ 08.01.05 18:22:

Ответ найден!

Ошибка в XSLT шаблоне:

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:eek:utput
xmlns="http://www.w3.org/TR/xhtml1/strict"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
encoding="UTF-8"
indent="yes"
method="xml"
omit-xml-declaration="no"
version="1.0"
media-type="text/xml"
/>

Я не в том месте определял xmlns для XHTML 1.0 документа (писал в xsl:stylesheet, а надо писать в xsl:eek:utput).

То что написано выше&nbsp;&mdash;&nbsp;создаёт валидный xhtml 1.0 документ.

Всем спасибо за внимание! Тема закрыта.
 
Сверху