Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > PHP + XML + XSLT


Автор: Opik 20.6.2005, 02:41
Как я понял, современный сайт, созданный по последним технологиям должен быть в этой связке (ну и данные, например в MySQL) и на выходе XHTML.
c XML и тем более с XSLT не знаком, поэтому прошу Вас объяснить. Да, гугл ещё не закрыли, но не нашел примера, где это всё связано в одном примере. Допустим я хочу написать скрипт новостей.
news.php
Код

<?php
  $dsn = 'mysql:dbname=test;host=127.0.0.1';
  $user = 'root';
  $password = '';

  try {
     $dbh = new PDO($dsn, $user, $password);
     $sql = 'SELECT * FROM `news` WHERE news_public = :public';
     $sth = $dbh->prepare($sql, array(PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY));
     $sth->execute(array(':public' => 1));
     while($row = $sth->fetch())
     {
// $row['news_title'] - название.
// $row['news_author_name'] - имя автора.
// $row['news_text'] - текст новости.
     }

  } catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
  }
?>

Как и что организовывать далее?

Автор: IZ@TOP 20.6.2005, 17:02
Мне тоже это очень интересно. Думаю что нужно создать XML документ в который добавлять поочередно ветки с новостями до получения необходимого результата:

Код

<?xml version="1.0" ?>
<News>
    <Item id="1">
        <Title>Заголовок новости</Title>
        <Author>IZ@TOP</Author>
        <Text>текст новости</Text>
    </Item>
    ...
</News>


Далее рисуем свой XSLT шаблон либо используем РНР функции XSLT преобразования.

А вот конкретный пример был бы интересен smile

Автор: Opik 20.6.2005, 17:50
IZ@TOP
Не, ну по отдельности я это всё понимаю примерно как ты, но я плохо представляю конечный продукт.

Автор: IZ@TOP 20.6.2005, 20:36
http://ru3.php.net/manual/ru/function.domxml-xslt-stylesheet-file.php
Наверное примерно так и выглядит smile

Автор: Opik 20.6.2005, 22:28
Код

<?php

$xmldoc = domxml_open_file("dom.xml");
$xsldoc  = domxml_xslt_stylesheet_file ("dom.xsl");
$result  = $xsldoc->process($xmldoc);
 print $result->dump_mem();

?> 

$xmldoc = domxml_open_file("dom.xml"); значит данные хранятся в xml файле, а нам нужно в базе.

Автор: IZ@TOP 21.6.2005, 00:15
Opik, можно сделать тоже самое только с созданным документом, используй функции создания документа или загрузки его из памяти (читай переменной).

Код

<?php

$xmldoc = domxml_new_xmldoc('1.0');
$docroot = $xmldoc->add_root('News');

$newschild = $docroot->new_child('article', '');
$newschild->set_attribute('id', 398);

$newschild->new_child('title', 'Title');
$newschild->new_child('author', 'Author name');
$newschild->new_child('newstext', 'Text news');

/* 
    // Если нужно просмотреть что у нас вышло, вызываем такой кусочек кода:
    // echo htmlspecialchars($xmldoc->dump_mem()); 
*/


// И далее
$xsldoc  = domxml_xslt_stylesheet_file("style.xsl");
$result  = $xsldoc->process($xmldoc);
print $result->dump_mem();

?>

Автор: Opik 21.6.2005, 00:41
IZ@TOP
вот это уже интереснее smile))

Автор: IZ@TOP 21.6.2005, 00:49
Вот что у меня вышло:

Код

<?php

$xmldoc = domxml_new_xmldoc('1.0');
$docroot = $xmldoc->add_root('News');

$newschild = $docroot->new_child('article', '');

$newschild->new_child('date', '12/31/2005');
$newschild->new_child('title', 'Title');
$newschild->new_child('author', 'IZ@TOP');
$newschild->new_child('newstext', 'XSL Templates rules! Ostalos` razobrat`sya s kodirovkami i vse budet rul`no!');

/* 
    // Если нужно просмотреть что у нас вышло, вызываем такой кусочек кода:
    // echo htmlspecialchars($xmldoc->dump_mem()); 
*/


// И далее
$xsldoc  = domxml_xslt_stylesheet_file(dirname(__FILE__)."/style.xsl");
$result  = $xsldoc->process($xmldoc);
print $result->dump_mem();

?>


-- style.xsl
Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="article">
    <html>
    <head>
    <title>Today's greeting</title>
    <style>
        * {
            font-family: Tahoma;
            font-size: 11px;
        }
    </style>
    </head>
    <body>
        <center>
        <div style="width:400;" align="justify">
            <b><xsl:value-of select="date"/></b> | <xsl:value-of select="title"/>
            <p><xsl:value-of select="newstext"/></p>
            <div align="right"><i><xsl:value-of select="author"/></i></div>
        </div>
        </center>
    </body>
</html>
</xsl:template>
</xsl:stylesheet>


Добавлено @ 00:50
осталось разобраться с циклами и условиями и можно брать шаблонную часть Vingrad CMS на себя smile

Автор: Opik 21.6.2005, 00:50
правда сами шаблоны какие то странные smile)) короч почитать нужно.

Автор: IZ@TOP 21.6.2005, 00:54
Opik, пожалуйста http://msdn.microsoft.com/library/en-us/xmlsdk/html/678bcd68-cbbb-4be5-9dd2-40f94488a1cf.asp читай сколько душе угодно. А я спать.

Автор: Opik 21.6.2005, 00:57
с меня +

Автор: Opik 21.6.2005, 02:08
Хотя всё равно ничего не ясно. как в ПХП5 работать с XML, а именно создавать на лету.

Автор: IZ@TOP 21.6.2005, 14:00
Opik, вечером поставлю и посмотрю что с этим можно сделать.

Автор: Opik 21.6.2005, 14:20
Хотя поставил php_domxml.dll... функция domxml_new_doc работает а append_child ругается. хотя думаю моя вина. вообщем буду ещё тестить

Автор: Gold Dragon 21.6.2005, 15:21
Opik
объясни как поставил, у меня что-то на всё ругается, может скачал что-то не то

Автор: Opik 21.6.2005, 16:05
в том то и дело, что мы ещё сами не поняли.

Автор: IZ@TOP 21.6.2005, 20:33
Пришел домой, сейчас буду разбираться и тестить все это дело под РНР 5 и РНР 4.3.10.

Автор: Opik 22.6.2005, 12:46
кстати, те твои предыдущие примеры пашут smile

Автор: IZ@TOP 22.6.2005, 13:16
Opik, что ты сделал? Значит можно использовать этот подход.
Я кстате хочу попробовать поюзать SimpleXML, говорят что с ним работать еще удобнее. Может быть его использовать можно будет для парсинга конфигов.

Автор: Opik 22.6.2005, 15:21
IZ@TOP
php_domxml.dll поставил, только у тебя там старые функции (по мануалу). а в новой вроде баг есть smile)

Автор: IZ@TOP 22.6.2005, 16:27
Что за баг?

Вот я тут модифицировал немного стили и XSL шаблон:

Код

<?php
$GLOBALS['test']    = 2;
$xmldoc = domxml_new_xmldoc('1.0');
$docroot = $xmldoc->add_root('articles');

$newschild[0] = $docroot->new_child('article', '');
$newschild[0]->set_attribute('id', 1);
$newschild[0]->set_attribute('test', 2);

$newschild[0]->new_child('date', '12/31/2005');
$newschild[0]->new_child('title', 'Title');
$newschild[0]->new_child('author', 'IZ@TOP');
$newschild[0]->new_child('newstext', 'XSL Templates rules! Ostalos` razobrat`sya s kodirovkami i vse budet rul`no!');

$newschild[1] = $docroot->new_child('article', '');
$newschild[1]->set_attribute('id', 2);
$newschild[1]->set_attribute('test', 'test');

$newschild[1]->new_child('date', '12/31/2006');
$newschild[1]->new_child('title', 'Title 2');
$newschild[1]->new_child('author', 'IZ@TOP');
$newschild[1]->new_child('newstext', 'XSL Templates rules! Ostalos` razobrat`sya s kodirovkami i vse budet rul`no!!!!');


/* 
    // Если нужно просмотреть что у нас вышло, вызываем такой кусочек кода:
    // echo htmlspecialchars($xmldoc->dump_mem()); 
*/


// И далее
$xsldoc  = domxml_xslt_stylesheet_file(dirname(__FILE__)."/style.xsl");
$result  = $xsldoc->process($xmldoc);
print $result->dump_mem();


Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
    <html>
    <head>
    <title>n</title>
    <style>
        * {
            font-family: Tahoma;
            font-size: 11px;
        }
    </style>
    </head>
    <body>
        <center>
        <xsl:for-each select="articles/article">
        <div style="width:400;" align="justify">
            <b><xsl:value-of select="date" /></b> | <xsl:value-of select="title" />
            <p><xsl:value-of select="newstext"/></p>
            <div align="right"><i><xsl:value-of select="author" /></i></div>
        </div>
        </xsl:for-each>
        </center>
    </body>
</html>
</xsl:template>
</xsl:stylesheet>

Автор: Opik 22.6.2005, 18:35
IZ@TOP
Код

$node = $dom->create_Element("root");
var_dump($node); // null, а должно быть object

Автор: OPG 23.6.2005, 13:43
Вопрос в теме немного не связанный.
Предлагаю открыть ветку форума где можно будет поэтапно пройти все стадии установки, создания документа, преобразования, парсинга, и работа с XSLT шаблонами.
Сейчас делаю двигатель сайта на этих технологиях в котором реализована идея как сделать сайт эффективным с той позиции, что повысить эффективность его влияния на принятие нужного тебе решения посетителем сайта. А также не выпускать его с сайтаsmile)) Ведь по сути можно делать быстрый, удобный и т.п. сайт, но о конечной цели почему то забывают. Сайт должен оказывать нужное воздействие на посетителя. Почему то все время пытаются взять дизайном, качеством контента и т.п. Построение сайта на основе шаблонов лишает сайта возможности использвать эффект синергизма. И в тоже время шаблоны нужны. Вот я и реализовываю это сейчас. А также вскорости выпускаю сайт посвященной этой проблеме.
Скажем так, я больше организатор и маркетолог (с многолетним опытом) в одном лице, который пару лет назад сел за компьютер с целью создать себе, то что отвечало бы моим интересамsmile))
Есть у меня куча замечательной литературы могу иногда присылать материалы отсканированные.
Отдельный разговор про совместную работу баз данных и XML.
Поверхностно скажу, что XML данные можно хранить в базе с сохранением структуры, но необходимо приниятие решения с какой степенью детализации.
Мой движок использует смешанную технологию, что , не только по моему мнению. является очень гибким решением.
В общем согласен иногда снабжать материалами, но вопросы нужны четкие и последовательные. Что скажете, господа модераторы?
P.S. Судя по всему немного народу пока сидит на этих технологиях. Иногда задавал вопросы, а ответа не получал. Приходилось ломиться самому, но все вопросы решаются.

Автор: Bikutoru 24.6.2005, 17:26
Сразу прошу прощения за оффтоп, но очень неймется smile ...
А что такое
Цитата
эффект синергизма

Автор: IZ@TOP 24.6.2005, 18:56
Цитата(yandex)
Эффект синергизма - это интеграция двух или более агентов или сил, действующих так, что их совместный эффект больше, чем сумма индивидуальных эффектов

Добавлено @ 19:01
Хотя что конкретно имел ввиду автор того сообщения я то же понять немогу... хотя это вроде что-то с экономикой связано?

Автор: Opik 25.6.2005, 09:14
Вообщем doxml не есть для 5.1 smile нужно юзать обычный DOM
Код

<?php
  $dsn = 'mysql:dbname=test;host=127.0.0.1';
  $user = 'root';
  $password = '';

  try {
     $dbh = new PDO($dsn, $user, $password);
     $sql = 'SELECT * FROM `news` WHERE news_public = :public';
     $sth = $dbh->prepare($sql, array(PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY));
     $sth->execute(array(':public' => 1));

     $xml  = new DOMDocument('1.0', 'UTF-8');
     $xsl_proc = new XSLTProcessor();
     $xsl  = new DOMDocument;
     $xsl->load('news.xsl');

     $xsl_proc->importStyleSheet($xsl);
     //print_r(get_class_methods($xsl));
     $root = $xml->createElement('news');
     $last = $xml->appendChild($root);

     while($row = $sth->fetch())
     {
          $id = $xml->createElement('item');
          $last2 = $last->appendChild($id);

          $text = $xml->createElement('text', $row['news_text']);
          $hz = $last2->appendChild($text);

          $title = $xml->createElement('title', $row['news_title']);
          $hz = $last2->appendChild($title);

          $author = $xml->createElement('author', $row['news_author_id']);
          $hz = $last2->appendChild($author);

          $date = $xml->createElement('date', $row['news_date']);
          $hz = $last2->appendChild($date);
     }
     print $xsl_proc->transformToXML($xml);
  } catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
  }
?>

news.xsl
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="UTF-8" indent="no"/>
 <xsl:template match="/">
  <html>
     <head>
        <title>n</title>
     </head>
     <body>
       <xsl:apply-templates select="news" />
     </body>
  </html>
 </xsl:template>
 <xsl:template match="news">
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template match="item">
  <h1><xsl:value-of select="title"/></h1>
  <h2>by <xsl:value-of select="author"/> - <xsl:value-of select="date"/></h2>
  <hr />
 </xsl:template>
</xsl:stylesheet>

Автор: dm9 29.9.2005, 17:46
Цитата(Opik @ 22.6.2005, 16:21)
php_domxml.dll поставил, только у тебя там старые функции (по мануалу). а в новой вроде баг есть )


А можно про баг поподробнее? smile

Автор: Opik 30.1.2006, 21:17
dm9
Я точно не помню уже.
Если ставить пхп5.1 и юзать дум. - проблем не будет.

Автор: dm9 31.1.2006, 10:23
Opik, уже три сайта работают на DOMXML, пока проблем не было smile

Нет, вру, была одна. Некорректная отработка <xsl:copy-of> была, для текстовых нод. Но это мелочи, жить можно.

Автор: Alx 16.4.2007, 15:45
что-то я ничего не понимаю! что нужно сделать, чтобы начать работать с xml? какие-то расширения скачать? можно в двух словах, по русски, плиз..
и как сделать, чтобы работало и в 4 и в 5 версиях?..

Автор: Alx 16.4.2007, 16:08
у меня дома денвер с PHP 4.4.4, на хостинге - PHP 5.2, что делать-то?

Добавлено через 2 минуты и 2 секунды
Цитата(Alx @  16.4.2007,  15:45 Найти цитируемый пост)
и как сделать, чтобы работало и в 4 и в 5 версиях?.. 

копать в сторону PECL.. только ребята из php очень не советуют этого делать, говорят всем переходить на DOM (php5).. а какое примерно процентое соотношение php4 и php5 на современных хостингах стоит? я хочу сказать, можно ли забивать на php4 совсем?

Автор: sergejzr 16.4.2007, 16:14
Чтобы начать работать, нужно понять каки всё это работает. Софт практически не нужен. Главное чтобы сервер выдавал ХМЛ, а как он это делает, через ДОМ, шаблон или просто print - пофиг.

Автор: Alx 16.4.2007, 16:14
как я понимаю, поддержка xslt ни в domxml ни в dom не присутсвует? :(

Добавлено через 3 минуты и 22 секунды
Цитата(sergejzr @  16.4.2007,  16:14 Найти цитируемый пост)
Чтобы начать работать, нужно понять каки всё это работает. Софт практически не нужен. Главное чтобы сервер выдавал ХМЛ, а как он это делает, через ДОМ, шаблон или просто print - пофиг. 

мне нужно (по крайней мере сейчас):

- загрзузить xml-файл
- применить к нему xslt-форматирование
- вывести xhtml

например так:

Код

<html>
<head>
<title>HTML + XML (server-side (PHP) parsing)</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<b>here comes the result of works.xml & sheet.xsl generated code</b>
<?
// xml + xslt => xhtml
?>
</body>
</html>

....

Автор: -=Ustas=- 18.4.2007, 22:52
Цитата(Alx @  16.4.2007,  16:08 Найти цитируемый пост)
у меня дома денвер с PHP 4.4.4, на хостинге - PHP 5.2, что делать-то?

Самый лучший вариант, это поставить дома нормальный сервак, т.е. апач+php5.2.1 ну и что еще надо MySQL ли PostgreSQL.

Автор: Alx 20.4.2007, 00:29
в общем так. поставил на свой денвер php5. скачал с сайта denwer.ru
устанавливаешь, больше ничего делать не надо, все уже включено.
пошёл на php.net, нашел DOM, SimpleXML и XSLTProcessor.
последние два вывели мне helloworld:

Цитата(Alx @  16.4.2007,  16:14 Найти цитируемый пост)
мне нужно (по крайней мере сейчас):

- загрзузить xml-файл
- применить к нему xslt-форматирование
- вывести xhtml


Код

$xml = simplexml_load_file('tree.xml');
$xsl = simplexml_load_file('sheet.xsl');

$xslt = new XSLTProcessor(); // объект для XSL-преобразований
$xslt->importStyleSheet($xsl); // ему нужна xsl-таблица...

echo $xslt->transformToXML($xml); // ... и xml-древо


http://alx.vingrad.ru/dev/xml/php5

только вопрос. почему на выходе кодировка UTF-8?
в encoding обоих XML-файлов прописана windows-1251..

Автор: -=Ustas=- 20.4.2007, 09:24
Ну все правильно, SimpleXML всегда приводит к юникоду. Точно не помню, можно или нет, но ссудя по всему нужно через iconv() прогонять.

Автор: dm9 20.4.2007, 09:54
Цитата(Alx @  20.4.2007,  01:29 Найти цитируемый пост)
только вопрос. почему на выходе кодировка UTF-8?в encoding обоих XML-файлов прописана windows-1251..


Намёк: <xsl:output...>

Автор: Alx 20.4.2007, 13:23
dm9, 
о, благодарю тебя, друг мой! smile

Добавлено через 2 минуты и 16 секунд
а что, если я просто с xml-файлом работаю? без xslt.. все равно глюки с кодировкой..

Автор: check 5.5.2007, 14:55
У меня вот такой вопрос возник... Почему лучше и правильнее(если это действительно лучше и правильнее) генерить XML средствами DOM(ну или SimpleXML,  кому что больше нравится),   вместо того чтобы формировать его как строку.   

С парсингом всё понятно,   а вот с генерацией  -  тут преимущества DOM для меня неочевидны.  Точнее говоря я не вижу их вообще.
 
Я в данный момент пишу для себя движок,  в котором шаблонная часть 
будет реализована с помощью XML-XSLT. 
Так вот сейчас XML у меня генерится следующим образом
Код

    $news = $dm->SelectNews(); //достаём то что нужно из БД 
    for ($i=0; $i < count($news); $i++) {
        $news[$i] = "<article id=\"".$news[$i]['id']."\">\n".
        "<date>".$news[$i]['date']."</date>\n".
        "<title>".$news[$i]['title']."</title>\n".
        "<visits>".$news[$i]['visits']."</visits>\n".
         "<comment>".$news[$i]['comment']."</comment>\n".
         "</article>\n";
    }
    $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<news>\n".
    implode("", $news)."</news>";


Дальше уже работаю с ним через DOM: достаю нужный xsl-шаблон,
выполняю преобразование, вывожу результат.
Код

    $domxml = new domDocument();
    $domxml->loadXML($xml);
        $xsl = file_get_contents("../xml/news.xsl");
    $domxsl = new domDocument();
    $domxsl->loadXML($xsl);
    $xsl = new xsltProcessor();
    $xsl->importStylesheet($domxsl);
    echo $xsl->transformtoXML($domxml);  


Вот мне и интересно,  если я переделаю генерацию xml-я средствами DOM,  какие выгоды это мне даст?
Ну кроме того,  что код будет более чистым, поскольку в PHP-коде не будет вообще никаких тэгов, не только ХэТэМээЛьных, но даже и ИксЭмЭльных.  А ради этого, вобщем, весь сыр-бор и городится  smile 
По мере изложения вопроса, сам же начал на него отвечать...
Но всё-таки - что ещё?   Почему это не надо делать так, как у меня сейчас сделано?
А как, например , с производительностью?
Я почти уверен,  что генерация DOM-ом работает медленнее.  Или нет?  

Автор: dm9 7.5.2007, 10:07
check, производительность - ХЗ, надо думать, а лучше пробовать.

А вот насчёт корректности кода - когда ты генерируешь XML строкой, ты имеешь шанс нарваться на какую-то ошибку в формировании этой строки. Например, пропустишь закрытие тэга. И обнаружишь это отнюдь не сразу - а (по закону подлости) тогда, когда проект будет находиться в эксплуатации. А в процессе тестирования ты просто не войдёшь в тот 'if', который содержит ошибочный код.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)