Сделать стартовой / Добавить в избранное / Написать нам
МЕНЮ
ОС Windows
ОС Linux
    » Дистрибутивы
    » Безопасность
    » Сети
    » Аппаратное обеспечение
    » Программирование
    » Система, ядро, утилиты
    » Программное обеспечение
    » Прочее
BIOS
Сети
Безопасность
Вебмастеру
Программисту
Железо

СВЕЖИЙ СОФТ
ЕГЭ ГИА 2011 репетитор и задачник
Гость 11 Портье
Мини-Сайт v.3.6
Мини-Каталог 1.0
Мини-Кадры 1.0
Мини-Смета v.1.4
Мини-Автопредприятие v.1.13
Мини-Зарплата v.3.3
Жадюга 1.9
LLLLLL
ОС Linux   Программирование

ОС Linux -> Программирование ->Интсрукция по созданию новостной ленты с использованием XML/XSLT

Интсрукция по созданию новостной ленты с использованием XML/XSLT

дата добавления: 20.06.2005, просмотров: 2842

Приручение XML

Иллюстрация поиска решения + как возможно проще про XML (навеяно сайтом gentoo.org и проектом linuxdoc, где XML технологии давно и успешно применяются)
(( изучение материалов http://www.w3c.org крайне приветсвуется ))
(( см.также http://www.xmlsoft.org/XSLT.html ))

Задача, в общем, типичная: "сделать страницу с новостями"

Более подробно :

  • надо иногда публиковать небольшие сообщения.
  • механизм публикаций сугубо на моей совести.
  • из всего офисного барахла под это дело подходит только шлюз, на котором крутится Linux.
  • на шлюзе отсутсвуют (пока) apache,php,sql

Первое-же решение (в лоб) :

  • установить apache,php,sql
  • создать БД и php-шный скрипт

Это решение после перекура и бутылки пива отброшено, как заведомо неверное, потому как придется холить и лелеять помимо apache еще и php с sql. И вообще ставить sql только ради новостей - как-то глупо. Сделать руками html и потом всегда его править - тоже как-то не то..

После чего последовало изучение - что уже есть из того, что может пригодиться. Ага ! xsltproc имеется..man xsltproc..Хмурю лоб - вещь хорошая, но придется расширять кругозор - понять как xslt работает..

links http://www.w3c.org - через пару часов ясно, что для поставленной задачи вполне подходит, и минимальный знаний подчерпнутых из стандарта хватит для решения.

Второе решение :

  • установить только apache (куда-ж без него-то)
  • сделать xml-страницу и к ней xslt
  • для публикации редактировать xml-ку и натравливать xsltproc, чтобы получить html

Сказано-сделано :

  • ставлю apache
  • пишу news.xml,news.xsl # xstproc news.xsl news.xml > news.html
  • проверяю - работает

Ура ! html не надо править в ручную, достаточно внести нужные правки в xml (что проще) и все ok. Однако нет предела совершенству - возникает следующий вопрос - а вот например сделать файл news2.xml как дополнение к news.xml?

Создаю..

# cp news.xml news2.xml

Пробую..

# xsltproc news.xsl news.xml news2.xsl    

Не получилось: html-заголовки повторены дважды.. А может, их сначала слить ?

# cat news.xml news2.xml | xsltproc news.xsl -

тоже не то.. в xml-е корневая запись должна быть одна (да и заголовок тоже один) Ну тогда sed`ом их.

Алгоритм примерно таков : для суммарного файла сделать свой заголовок и свой хвост, и слить в него все исходные, попутно вырезая строчки типа <?xml...?> Делаю..вышло..только придется xsl немного править

Окончательное решение : каждую новость помещать в отдельный xml..(в каталог news-in) при добавлении/удалении новости переделывать суммарный xml и транслировать его в html. чтобы новости шли последовательно исходные файлы сортировать по времени. а старые новости (;-)) можно убивать по крону.. Вуалля !

Плюсы решения :

  • полученны и примененны новые знания
  • сэкономлено время
  • сэкономленны ресурсы (один раз запустить xslt вместо того чтоб круглосуточно гонять базу)
  • оформление(дизайн) отделен от содержания - внешний вид можно курочить отдельно от логики
  • внешние приложения могут обращаться напрямую к summary.xml и брать оттуда информацию (проще чем царапать из html)

Минусы :

  • чтобы создать/опубликовать новость надо все-же знать xml и принятый формат
  • надо еще иметь права на запись в news-in..(хотя новости можно собирать и по домашним каталогам)

Кратко про XML :

(в рамках приведенного примера)

Файл начинается с заголовка <?xml version="version" encoding="encoding"?> далее - иерархия узлов,обрамленных тегами как в html - <tag>текст</tag> в xml-файле должен быть только один узел верхнего уровня. теги могут иметь аттрибуты оформленные в виде attr="value" Например : <person sex="man">Петя</person>

Кратко про XSL :

(в рамках приведенного примера)

xsl соответсвует формату xml, то есть тоже начинается с заголовка и включает иерархию узлов. Верхний уровень будет зваться <xsl:stylesheet> Есть три важных узла : <xsl:template macth="xpath"> - описание шаблона,который будет применяться к узлам xpath <xsl:apply-templates select="xpath"/> - ставиться в то место где надо применить шаблон (куда будет подставлен результат) <xsl:value-of select="xpath"/> - похож на apply-templates, но шаблон применяться не будет, а будет подставлена значение xpath xpath адресует узлы в исходном xml-документе "/" - корневой узел "node" - узел типа node следующий за данным "@attr" - значение аттрибута attr текущего узла и так далее..

Прим.:

  1. Mozilla и IE вполне спокойно открывают xml`ки и делают все требуемые xslt-преобразовая уже на стороне клиента.(без xsltproc)
  2. Никто не запрещает прицепить еще и CSS
  3. "Не стреляйте в пианиста - он играет как умеет" :-) - слияние xml-ков можно (и нужно наверное) делать не sed`ом, а тем-же xslt к примеру. (правда sed`ом проще и быстрее) - в вызове sed - есть видимо мелкая ошибочка ;-)
  4. Не забудьте правильно выставить права доступа !!

Далее приведу все упомянутые файлы :

  • news.sh - элементарный bash-скрипт, делает из нескольких файлов .xml один
  • summary.xsl - шаблон трансформации нашего файла с новостями в html
  • sample-news.xml - пример файла новостей
  • summary.css - таблица стилей

---- news.sh ----------------------------------------------------

#!/bin/bash
# делаем заголовок для суммарного xml-файла
echo '<?xml version="1.0" encoding="koi8-r"?>' > summary.xml
echo '<?xml-stylesheet type="text/xml" href="summary.xsl"?>'>> summary.xml
echo '<summary>' >> summary.xml
# сливаем в него все имеющиеся новости
for name in `ls -1 --sort=time ./news-in/*.xml | head -n 30`;do
    sed "s/<?xml.*?>/<!--removed-->/" $name >> summary.xml
done
# пишем хвост для суммарного файла
echo '</summary>'>> summary.xml
# делаем html
xsltproc summary.xsl summary.xml > summary.html

---- end news.sh ------------------------------------------------

---- summary.xsl ------------------------------------------------

<?xml version="1.0" encoding="koi8-r"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="koi8-r"/>
<!-- предыдущие строки можно считать просто заклинанием -->
<!-- генерация html-заголовка (обработка корневой записи) -->
<xsl:template match="/">
    <html lang="ru">
    <head>
    <!-- не ставьте Content-Type - xsltproc сам его сделает -->
    <title>Новости</title>
    <!-- а вот так цепляется таблица стилей -->
    <link rel="stylesheet" type="text/css" href="summary.css"/>
    </head>
    <body>
    <!-- обработка всех новостей -->
    <xsl:apply-templates select="summary"/>
    </body>
    </html>
</xsl:template>

<!-- перехватываем узлы summary - он у нас только один такой -->
<xsl:template match="summary">
    <h3>Новости</h3>
    <!-- обработка каждой новости -->
    <xsl:apply-templates select="news"/>
</xsl:template>

<!-- перехватываем узлы news - описания каждой отдельной новости -->
<xsl:template match="news">
    <!-- форматирование новости -->
    <span id="news-date"><xsl:value-of select="date"/></span>
    <span id="news-author"><xsl:value-of select="author"/></span>
    <span id="news-title"><xsl:value-of select="title"/></span>
    <span id="news-brief"><xsl:value-of select="brief"/></span>
    <p>
    <xsl:apply-templates select="text()"/>
    </p>
    <hr/>
</xsl:template>

</xsl:stylesheet>

---- end summary.xsl ----------------------------------------------

---- sample-news.xml -----------------------------------------------

<?xml version="1.0" encoding="koi8-r">
<!-- Просто пример формата файла с новостью -->
<news>
    <date>14.01.2004</date>
    <author>I`m</author>
    <title>Пример новости</title>
    <brief>файл сделанный для примеров и тестов</brief>
    Дальше пошел порсто произвольный текст..
    И так далее и так далее..
</news>

---- end sample-news.xml -------------------------------------------

---- summary.css ---------------------------------------------------

#news {
    border-width:2px;
    border-style:outset;
}
#news-date {
    font-style:italic;
    margin-left:10px;
}
#news-author {
    font-style:italic;
    font-size=80%;
    margin-left:10px;
}
#news-title {
    font-weight:bold;
    margin-left:10px;
    text-transform:uppercase;
}
#news-brief {
    margin-left:10px;
}

--- end summary.css ---------------------------------------------------

Статья взята с сайта OpenNet.

комментарии к статье (0)

Ссылки по теме:

  • От C к Ассемблеру
  • Поддержка плагинов в программах на Python
  • Анализатор сетевого трафика
  • Разработка простых интерфейсов с помощью dialog/Xdialog
  • Трассировка процессов с помощью Ptrace

  • ВХОД
    (?)
    |
     
       Copyright WinSov © 2003-2005. При использовании материалов ссылка на www.winsov.ru обязательна.
       Designed by "2BEST Studio",  Developed by #Dialer
    Вверх