Archive for the ‘xslt’ 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);

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 надо поднимать из портов.

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

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

without no comments

Wednesday, May 9th, 2007

Стили коментариев в кодах програмных языков

  1. # php, perl, bash, mySql
  2. // php, javascript, ActionSctipt, Java, mySql
  3. /* php, javascript, css, ActionScript, Java, mySql */
  4. (* AppleScript *)
  5. AppleScript, mySql [два минуса]
  6. <!– html, xslt ->

Имена шаблонов

Tuesday, May 8th, 2007

К шаблонам template можно обратится не только по совпадению пути но и по имени которое почему-то называется mode. Это очень удобно если к примеру сделать зебру таблицу
xml

<books>
	<autor name="Robert Sheckley" />
	<autor name="Isaac Asimov" />
	<autor name="Ray Bradbury" />
	<autor name="Frank Patrick Herbert" />
</books>

xslt

<xsl:template match="/books/autor" mode="autors">
 <xsl:if test="(position() mod 2) = 0">
  <xsl:apply-templates select="." mode="row_gray" />
 </xsl:if>

 <xsl:if test="not((position() mod 2) = 0)">
  <xsl:apply-templates select="." mode="row_white" />
 </xsl:if>
</xsl:template>

<xsl:template match="/books/autor" mode="row_white">
 <tr><td>
  <xsl:value-of select="@name" />
 </td></tr>
</xsl:template>

<xsl:template match="/books/autor" mode="row_gray" >
 <tr><td bgcolor="#ccc">
  <xsl:value-of select="@name" />
 </td>

</xsl:template>

результат

Robert Sheckley
Isaac Asimov
Ray Bradbury
Frank Patrick Herbert

Пустые пространства

Friday, May 4th, 2007

Если между тегами xsl не получается поставить пробел или другой какой знак то лучше воспользовася тегом <xsl:text>

<xsl:number/>
  <span id="{date}">
    <xsl:value-of select="title" />
  </span>

1Foundation

но если добавить

<xsl:number/><xsl:text> </xsl:text>
  <span id="{date}">
    <xsl:value-of select="title" />
  </span>

1 Foundation

то пробел будет добавлен

substring before и after

Tuesday, May 1st, 2007

Еще одна неплохая функция в xslt. Наример можно получить кусок текста перед и после пробела, вот например решение с английской The

xml

The Martian Chronicles

xslt


 , The

html

Martian Chronicles, The

Сгенерировать ID

Friday, April 27th, 2007

В xslt наверное единственном из мне знакомых языков позаботились о том, что бы не ломать голову над тем, какой еще один уникальный id придумать для элемента.

<span id="{generate-id()}">

генерируется номер который скорее всего никогда не встретится в документе еще раз.