Archive for the ‘xml’ Category

Фильтр по аттрибутам

Tuesday, March 4th, 2008

Итак, создает простенький xml файл

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="t9.xsl"?>
<people>
 <person sex="male">Павел</person>
 <person sex="female">Наташа</person>
 <person sex="female">Лена</person>
 <person sex="male">Миша</person>
</people>

и немного сложный xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/people">
<html>
<body>
 <ul>
  <xsl:apply-templates
   select="/people/person[@sex='female']" />
 </ul>
</body>
</html>
</xsl:template>

<xsl:template match="/people/person[@sex='female']">
 <li><xsl:value-of select="." /></li>
</xsl:template>

</xsl:stylesheet>

теперь на странице будет отображаться только девочки )

Трансформация: php переменные в xslt

Thursday, February 21st, 2008

Начнем с того что создадим переменную в шаблоне и ее вывод

<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="error_msg" select="0" />
<html>
<head>
        <title>Books
</head>
<body>
<h1>Books</h1>
<xsl:value-of select="$error_msg" />
...

Внимание! У вас может появится желание убрать нолик из select="0", не делайте этого, удалите select=”0″ целиком.

<xsl:param name="error_msg" />

Теперь присвоем значение переменной в момент трансформации на стороне php

$proc = new XSLTProcessor();
$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('test4.xsl');
$xsl->importStyleSheet($doc);

$doc->load('test.xml');
$xsl->setParameter(NULL, 'error_msg', 'search item not found');
echo $xsl->transformToXML($doc);

Xul: xml template

Thursday, February 14th, 2008

Темплейты в XUL могут принимать разные данные: xml, rdf и даже могут на прямую работать с sqlight (в версии 3). У нас есть xml файл с даными, data.xml.

<?xml version="1.0" encoding="utf-8"?>
<know>
  <person name="php" type="lang"/>
  <person name="perl" type="lang"/>
  <person name="apache" type="server"/>
  <person name="unix" type="system"/>
</know>

теперь загрузим его список

<radiogroup datasources="data.xml" ref="*" querytype="xml">
  <template>
    <query expr="know" />
    <action>
      <radio uri="?" label="?name" />
    </action>
  </template>
</radiogroup>

Xul-xml-templateрезультат будет таким ->

Надо заметить что удалять uri=”?” из кода не стоит, он генерирует некий код по которому можно будет работать с xml далее, впрочем если удалить то работать не будет )

Кроме того xml не обязательно длжен содержаться в отдельном файле, его можно поместить и внутри кода

<know id="mylist" xmlns="">
.......
</know>
<radiogroup datasources="#mylist" ref="*" querytype="xml">
.......
</radiogroup>

xsltproc

Friday, February 1st, 2008

Трансформировать xml через xslt можно прямо в консоли используя команду

xsltproc file.xsl file.xml > file.html

Если в самом xml прописан стиль

<?xml-stylesheet type="text/xsl" href="test4.xsl"?>

то xslt файл вовсе не нужно указывать.

xsltproc file.xml > file.html

ps: по умолчанию xsltproc установлен в mac os x, во FreeBSD надо поднимать из портов.

Простую справку в контекстную

Thursday, January 17th, 2008

В больших проектах всегда создается подробный справочный раздел, пошаговые инструкции и общая информация. Над таким разделом работает редактор. Но вот когда дело доходит до контекстной справки то здесь возникает проблема. вроде как бы справочный раздел уже есть и формировать еще один но порезанный на кусочки дело муторное, к тому же надо постоянно следить за изменениями. Вот небольшое решение для создания простой контекстной справки. Во-первых нам нужен сам html файл со справкой
help.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
 <meta http-equiv="Content-Type"
   content="text/html; charset=utf-8" />
 <title>Untitled Document
</head>
<body>
 <div id="user_sessings">
  <h2>User settings

   in this section....
 </div>
 <div id="time_sessings">
  <h2>Time settings

  Time is most inportant for your ....
 </div>
</body>
</html>

Теперь создаем php файл, но перед этим мы вспомним что у DOMDocument проблемы с функцией getElementById поэтому берем надстройку над DOMDocument исправляет неправильный id на xml:id
get_help.php

include "DomDoc.php";

$dom = new DomDoc();
$dom->loadHTMLFile("help.html");
$part = $dom->getElementById($_GET[part]);
header ('Content-type: text/xml');
echo $dom->saveXML($part);

Вот и все теперь ставите на странице в нужном вам месте значок справки, вешаете на него JavaScript с Ajax который отправляет запрос на get_help.php?part=time_sessings и получаете возвратом кусок нужной вам справки, в нашем случае

<div id="time_sessings">
 <h2>Time settings

 Time is most inportant for your ....
</div>

и вставляете его в окно контекстной справки.

Не забыть про черту

Thursday, November 22nd, 2007

FireFox быстро приучает к хорошему, порой забываешь, что-то может не работать. Например определение кодировки utf-8. Mysql понимает кодировку utf8, php понимает кодировку utf8, и наконец ее понимает FireFox. Все работает здорово пока в один день не понимаешь, что MSIE не понимает твой Ajaх запрос посланный в XML и все из за того, что он прописан как utf8, а не utf-8. Поэтому важно следить за этим.

XML на AppleScript

Wednesday, October 31st, 2007

AppleScript бладает возможностью читать ит извлекать данные и XML файлов. Расмотрим пример.

<?xml version="1.0" encoding="UTF-8"?>
<values>
	<node>
		<label>xml</label>
		<value>7</value>
	</node>
	<node>
		<label>php</label>
		<value>9</value>
	</node>
</values>

(more…)

Умные селекторы в css

Thursday, October 25th, 2007

Помимо воздействия на элементы через атрибуты class и id еще в css2 были заложены селекторы которые сильно помогли бы, если б не игнорировались MSIE6 зато поддерживаются MSIE7 и всеми остальными хорошими браузерами
Три вариации:
A[attr="value"] - совпадает со всеми элементами у которых некий атрибут имеет значение “value”
A[attr~="value"] - совпадает со всеми элементами у которых некий атрибут имеет значение начинающееся с “value” дальше дефис и остальная часть. Например col-01, col-02
A[attr|="value"] - тоже самое что и предыдущий только вместо дефиса используется пробел
Теперь наглядно

<style>
	a[title="open"] {
		color: green
	}
	a[warning="warning"] {
		color: yellow
	}
	a[rel|="copy"] {
		color: maroon
	}
	a[rel ~="copy"] {
		color: red
	}
	a[rel ~="copy"][title="close"] {
		text-decoration: none;
	}
</style>
</head>
<body>
	<a href="#" title="open">green |
	<a href="#" warning="warning">yellow |
	<a href="#" rel="copy-1">maroon |
	<a href="#" rel="copy-2">maroon |
	<a href="#" rel="copy 1" title="close">red with out line |
	<a href="#" rel="copy 2">red
</body>

Примечание: можно играться с любым атрибутом кроме ID видимо из за того что у css на его счет свои инструкции

Поддержка версий

Tuesday, May 15th, 2007

Вообще работа с xslt во многом зависит от того процессора с которым вы работаете. Я например, для простоты использую тот, что встроен в браузер, но браузеры поддерживают как правило xslt1.0, и как в случае с html поддержка их тоже не одинакова. Можно трансформировать чем то более серьезным. В любом случае, какой бы процессор не использовался, можно заранее позаботиться о совместимости версий или просто проверить какой процессор у вас и что он поддерживает, тоже бывает полезным при отладке.

Для начала получим версию процессора

<xsl:value-of select="system-property('xsl:version')" />

затем проверим пооддерживает ли он элемент

<xsl:value-of select="element-available('xsl:for-each')" />

или нужную функцию

<xsl:value-of select="function-available('round-half-to-even')" />

в первом случае возвращается номер вверсии в остальных двух frue или false. Теперь попробуем этим воспользоватся

<xsl:if test="not(element-available('xsl:for-each-group'))">
	for-each-group is not supported
</xsl:if>

Фильтрация

Saturday, May 12th, 2007

В xslt есть множество способов фильтрации данных и вот один из них
Вот схематичное отображение xml. Оригинал можно посмотреть здесь

<books>
	<autor name>
		<book>
			<title>
			<date>

теперь попробуем получить все книги за 1960 год

<xsl:template match="/books/autor">
 	<xsl:apply-templates
 	 	select="book[starts-with(date, '1960')]" />
</xsl:template>

как результат получаем список книг вышедших в 1960 году

Meeting of the Minds, Store of Infinity