<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>XHTML+XSLT = SEO  (о валидном  NOFOLLOW и инвалидном NOINDEX  )</title>
    <meta name="css" content=""/>
    <meta name="js" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="16"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / XHTML+XSLT = SEO  (о валидном  NOFOLLOW и инвалидном NOINDEX  )</h1>
          <ol class="tags big">
            <li>
              <a href="/seo">seo</a>
            </li>
            <li>
              <a href="/client-side-xslt">client-side-xslt</a>
            </li>
          </ol>
          <div class="myContent"><h2>Введение</h2>
<p>В области поисковой оптимизации возникают специфические задачи с манипуляцией HTML. Наиболее распространенные – сокрытие текстов от поисковых машин, запрет на учет роботами определенных ссылок.</p>
<p>Основная проблема в решении этих задач – несогласованность решений предлагаемых различными поисковыми машинами, несоответствие этих решений стандартам w3c, необходимость использования JavaScript.</p>
<p>Например конструкции, запрещающий индексацию части текста и неучитывающая ссылки при передаче PR: <br/>
&lt;noindex&gt;             текст запрещенный к индексации в Yandex и Rambler,&lt;/noindex&gt;             <br/>
&lt;a href=”http://url.com” rel=”nofollow”&gt;             неучитываемая в Google ссылка&lt;/a&gt;</p>
<p>Поддерживаются одними поисковыми машинами и не поддерживаются другими.</p>
<p>Еще одной проблемой в поисковой оптимизации является необходимость перемещения определенных блоков текста и заголовков ближе к началу HTML. Но решение этой задачи через CSS не всегда возможно.</p>
<p>Решение всех этих задач было возможно благодаря внедренной еще в Microsoft Internet Explorer 5.0. технологии преобразования XHTML+XSLT. В настоящий момент основные альтернативные браузеры так же поддерживают эту технологию.</p>
<h2>Решения</h2>
<p>Все что написано ниже не представляет интереса для тех, кто хоть немного разбирается в XSLT-технологии, потому что все приведенные примеры тривиальны. Скорее это рассчитано на тех, кто слышал что такое бывает, но плохо представляет возможности использования XSLT.</p>
<p><strong>1. Сокрытие текста от роботов (альтернатива </strong><strong>noindex)</strong></p>
<p>Результат работы посмотреть (<a href="/doc/xslt1/ex1.exhtm">здесь</a>). Ниже приведен код исходного XHTML в котором часть текста закомментирована и результат наложения XSLT трансформации, в которой комментарий раскрывается. В этом случае скрытый текст спрятан от всех поисковых машин, и отсутствует noindex, вызывающий нарекания со стороны ревнителей стандартов.</p>
<p><strong>Исходный XHTML</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;?xml version="1.0" encoding="windows-1251"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="1.xsl"?&gt;   
&lt;html&gt;   
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
 Index it! &lt;/body&gt;   
&lt;/html&gt;   
&lt;/html&gt;           </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain"><!-- Идентичное преобразование -->
&lt;?xml version="1.0" encoding="windows-1251"?&gt;   
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;   
  &lt;xsl:output method="html"/&gt;   
  &lt;!-- Идентичное преобразование в следующих примерах будет подключено через include --&gt;   
  &lt;xsl:template match="*"&gt;   
  &lt;xsl:copy&gt;   
  &lt;xsl:apply-templates/&gt;   
  &lt;/xsl:copy&gt;   
 &lt;/xsl:template &gt;   


&lt;xsl:template match="div"&gt;   
&lt;div&gt;       

&lt;xsl:value-of select="comment()"/&gt;   
&lt;xsl:value-of select="."/&gt;   
&lt;/div   &gt;   
&lt;/xsl:template  &gt;   
&lt;/xsl:stylesheet  &gt;   
            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>Трансформация HTML+XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;html&gt;
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
NoIndex it! Index it!
&lt;/body&gt;   
&lt;/html&gt;   
&lt;/html&gt;           </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>К сожалению, снятие комментариев с фрагментов текстов, содержащих теги не представляется возможным из-за некооректной работы всех броузеров - FF, Opera, MSIE/ (<a href="/doc/xslt1/ex1e.exhtm">см. пример</a><br/>
Для обхода этой досадной ошибки текст не подлежащий индексации можно вставлять не в XHTML, а в XSLT. В этом случае в исходном XHTML он будет отсутствовать даже в виде комментариев и не останется в снипетах поисковых машин (копиях страниц, сохраняющихся в поисковых машинах).</p>
<p><strong>2. Сокрытие ссылки от роботов (альтернатива </strong><strong>rel=”</strong><strong>nofollow” и </strong><strong>JS)</strong></p>
<p>Для того чтобы ссылка не учитывалась в ссылочном ранжировании Google ввел атрибут ссылки rel=”nofollow”. Но этот атрибут не поддерживается российскими поисковыми машинами. Для того, чтобы упрятать ссылку от роботов приходится ее маскировать java-скриптами типа:<br/>
&lt;a href=”#” title=<a href="#" title="google.ru/" rel="nofollow" class="external">http://google.ru</a> onmouseover=”this.href=this.title”&gt;             Gooogle!&lt;/a&gt;</p>
<p>Предлагаемый вариант на XSLT прячет нежелательные ссылки от обоих поисковых машин. Результат работы и исходный код можно посмотреть <a href="/doc/xslt1/ex2.exhtm">здесь</a>. <br/>
В этом примере в исходном XHTML ссылка на сайт <a href="/">http://x9.ru</a> отсутствует. XSLT преобразовывает содержимое тега span в ссылку, присваивая ей адрес указанный в параметрах span.</p>
<p><strong>Исходный XHTML</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;?xml-stylesheet type="text/xsl" href="ex2.xsl"?&gt;
&lt;html&gt;   
&lt;head&gt;   
&lt;title&gt;       No follow&lt;/title&gt;   
&lt;/head&gt;   
&lt;body&gt;   
&lt;div&gt;   
&lt;span title="http://x9.ru"&gt;       No follow!! It's no link. It's span &lt;/span&gt;   
&lt;/div&gt;   

            &lt;/body&gt;   
            &lt;/html&gt;   
            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;
&lt;xsl:output method="html"/&gt;   
&lt;xsl:include href="copy.xsl"/&gt;   


&lt;!-- преобразование span в href --&gt;   
&lt;xsl:template match="span"&gt;   
&lt;a href="{@title}"&gt;       &lt;xsl:value-of select="."/&gt;       &lt;/a&gt;   
&lt;/xsl:template&gt;       
&lt;/xsl:stylesheet&gt;   
            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>Трансформация HTML+XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;html&gt;
&lt;head&gt;   
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;   
&lt;title&gt;       No follow&lt;/title&gt;   
&lt;/head&gt;   
&lt;body&gt;   
&lt;div&gt;   
&lt;a href="http://x9.ru"&gt;       No follow!! It's no link. It's span &lt;/a&gt;   
            &lt;/div&gt;         &lt;/body&gt;   
            &lt;/html&gt;   
             </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>Здесь так же приведем пример расширенный пример нескольких вариантов экранирования ссылки без применения опции <strong>rel=”</strong><strong>nofollow” </strong>и java-скриптов</p>
<p><strong>3. Произвольная перестановка блоков</strong></p>
<p>Этот пример скорее всего потерял акткуальность, но во времена, когда  свободное владение CSS считалось   чем-то выдающимся,  размещение ключевых слов ближе к началу HTML-кода  позволяло получить бонусы  в ранжировании страниц по релевантности. Во всяком случае таке мнение бытовало на SearchEngines.Ru еще 2-3 года назад. Впрочем, если немного пофантазировать, возможно этому приему можно будет найти другое применение. Ну хотя бы для манипуляций в стиле <u class="external" title="www.csszengarden.com/">css Zen Garden</u></p>
<p>Результат работы и исходный код можно посмотреть <a href="/doc/xslt1/ex3.exhtm">здесь</a>. <br/>
В этом примере блоки div расположены в произвольном порядке. XSLT преобразование выводит их в браузер в порядке значения title. Если такое нецелевое использование атрибута title не нравится, можно использовать любые другие атрибуты.</p>
<p><strong>Исходный XHTML</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;?xml version="1.0" encoding="windows-1251"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="ex2.xsl"?&gt;   
&lt;html&gt;   
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
22222222222
55555555555
77777777777
44444444444
66666666666
33333333333
11111111111
55555555555
&lt;/body&gt;   
&lt;/html&gt;   
&lt;/html&gt;           </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;
&lt;xsl:output method="html"/&gt;   
&lt;xsl:include href="copy.xsl"/&gt;   
&lt;!-- сортировка div --&gt;   
&lt;xsl:template match="body"&gt;   
&lt;body&gt;   
&lt;xsl:apply-templates select="div"&gt;   
&lt;xsl:sort select="@title"/&gt;   
&lt;/xsl:apply-templates&gt;   
&lt;/body&gt;   
&lt;/xsl:template&gt;   
&lt;/xsl:stylesheet&gt;           </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>Трансформация HTML+XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;html&gt;
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
11111111111
22222222222
33333333333
44444444444
55555555555
55555555555
66666666666
77777777777
&lt;/body&gt;             </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>4. Предупреждение для пользователей устаревших браузеров. </strong></p>
<p>Пользователям устаревших браузеров необходимо выдать предупреждение о том, что они видят не совсем то, что задумано дизайнером и им совершенно необходимо произвести обновление. Но остальным пользователям это предупреждение показывать не имеет смысла.</p>
<p>Рабочий пример приведен <a href="/doc/xslt1/ex4.exhtm">здесь</a>, тексты ниже:</p>
<p><strong>Исходный XHTML</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;?xml version="1.0" encoding="windows-1251"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="ex4.xsl"?&gt;   
&lt;html&gt;   
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
Wow! Fine design!  But You can't enjoy. Your must update your browser!  &lt;/body&gt;   
&lt;/html&gt;            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;
&lt;xsl:output method="html"/&gt;   
&lt;xsl:include href="copy.xsl"/&gt;   
&lt;!-- убираем с показа span --&gt;   
&lt;xsl:template match="span"/&gt;   
&lt;/xsl:stylesheet&gt;   
            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p><strong>Трансформация HTML+XSLT</strong></p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">&lt;html&gt;
&lt;head&gt;   
&lt;/head&gt;   
&lt;body&gt;   
Wow! Fine design!
&lt;/body&gt;   
&lt;/html&gt;            </pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>Этот пример может быть неправильно воспринят отдельными несознательными веб-мастерами. Я отнюдь не призываю использовать данный пример для обмана поисковых машин (я вообще ни к чему и никого не призываю). Мне просто не хотелось бы, чтобы эта заметка была истолкована превратно.</p>
<h3>Вопросы и проблемы</h3>
<p>Как обычно у сеошников возникает Extra FAQ – “А не забанят ли меня за это”. Однозначного ответа на этот вопрос как всегда нет. Вас непременно забанят по стуку, если будет потеряно чувство меры (см. комментарий к примеру 4).</p>
<p>Второй вопрос – как это индексируется. Яндекс и Google индексируют. И пока эта технология не получила распространение индексируют исходную страницу без XSLT преобразования. Но если технология получит распространение, поисковым машинам придется научаться индексировать преобразованные страницы. И вот тогда возникнет много новых интересных вопросов. <br/>
<br/>
И напоследок о проблемах. И этих проблем много и если получится подробнее о них напишу позже..<br/>
Главная проблема в браузерах, не поддерживающих преобразование XML+XSLT. На сегодняшний день это примерно 5%. Но даже при самых больших темпах перехода на FireFox и Opera 9, 2-3% консервативных пользователей достаточно долго будут пользоваться старыми версиями браузеров. <br/>
Другая проблема заключается в необходимости настройки HTTP-заголовков и DOCTYPE под разные браузеры. Те, кто привык проверять все сайты на w3.org обнаружат в приведенных примерах вопиющую ошибку - отсутствие DOCTYPE. Но ошибки здесь нет. На вход браузера отдается не XHTML, а XML. Такое решение выбрано из-за определенных проблем с XSLT трансформацией валидных XHTML в MSIE.</p>
<p> </p>
<h2>UPD1</h2>
<p>Это вторая версия сайта "<a href="">Тыманчи Ыргын</a>"  В ней так же используется клиентский XSLT и умеренная манипуляция контентом. Практически это живой тест на возможности индексирования поисковыми машинами XML+XSLT. Гарантии что сайт не будет забанен в Яндексе как обычно нет.</p>
<h2>UPD2</h2>
<p>Кстати, в версии 1.6.3 CodeIgniter появилась<a href="#" title="codeigniter.com/user_guide/database/utilities.html#xml" rel="nofollow" class="external"> утилита для выводa XML из SQL-запроса </a></p>
<h2>UPD3</h2>
<p>25.01.10 Google индексирует xslt-файл клиентсткого преобразования, но само преобразование не выполняет.</p></div>
          <ol class="tags big">
            <li class="date">2007-09-03</li>
            <li>
              <a href="/seo">seo</a>
            </li>
            <li>
              <a href="/client-side-xslt">client-side-xslt</a>
            </li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>ajaxian.com/archives/browser-detection-with-xslt</span> - <b>Browser Detection with XSLT. (Определение броузера через XSLT)</b></a>
            </li>
            <li>
              <a href="#"><span>www.blogovo.ru/archives/42</span> - <b>Валидный NOINDEX средствами XSLT. В блоге Николая Дубровского</b></a>
            </li>
            <li>
              <a href="#"><span>developer.mozilla.org/en/XSL_Transformations_in_Mozilla_FAQ</span> - <b>XSL Transformations in Mozilla_FAQ</b></a>
            </li>
            <li>
              <a href="#"><span>www.seoburg.ru/2007/01/25/162/</span> - <b>Инвалидный метод для валидации NOINDEX.  Еще одна попытка</b></a>
            </li>
          </ol>
          <ul class="comment">
            <li id="a84" title="a0">
              <a name="Le capitaine Nemo" title="" rel="07.09.08"/>
              <div>Тема конечно интересная, но несвоевременная. Пока броузеры не научаться нормально интерпретировать XSLT использовать клиентский XSLT не стоит. <br/>К тому же необходимость двух преобразований все таки никуда не годится.</div>
            </li>
            <li id="a86" title="a0">
              <a name="Serg" title="" rel="08.09.08"/>
              <div>Пример с перестановкой блоков можно использовать для генерирования уникального текста. Если покумекать немного.</div>
            </li>
            <li id="a88" title="a0">
              <a name="Le capitaine Nemo" title="" rel="10.09.08"/>
              <div>Не понимаю, зачем такие сложности, если есть javascript. Во всяком случае быстрее будет.</div>
            </li>
            <li id="a152" title="a88">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="10.11.08"/>
              <div>Ну быстрее и что? Зато через XSLT красивее. Мне так кажется. Ну и ни вы ни я не знаем, что завтра придумает Гугля. Вдруг начнет индексировать Javascript. Парсить научились года три назад? А XSLT до сих пор не парсят. Во всяком случае пока технология клиентского XSLT не получила распространение.</div>
            </li>
            <li id="a164" title="a0">
              <a name="Max" title="" rel="18.11.08"/>
              <div>Обычным jquery это решается в одну строку - замена спана на ссылку...<br/>Я придумал другой способ - если есть ссылки, которые не надо индексировать - то и не надо их делать ссылками... просто делаем спан с определённым аттрибутом и классом, далее в jquery опять же в одну строку навешиваем на эти спаны с онклики на функцию с window.location...Это выглядит типа так:<br/>Текст<br/>далее через гет по классу навешиваем each click function... Вуаля - и никакого мошенства</div>
            </li>
            <li id="a165" title="a152">
              <a name="&#x41E;&#x43F;&#x44F;&#x442;&#x44C; Max" title="" rel="18.11.08"/>
              <div>Ёпт - вырезало часть кода... там был спан с ид-урл, куда надо идти и класс для распознавания - типа "nenadoindeksirovatetussylku" :) и т.д.</div>
            </li>
            <li id="a170" title="a164">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="18.11.08"/>
              <div>Ну кто бы спорил. Тут скорее фантазии на тему клиентского XSLT. <br/>А вот по поводу js - не знаю. Нет никакой уверенности что Google такую схему не засечет и не учтет. Он хитрый. JS знает.</div>
            </li>
            <li id="a171" title="a165">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="18.11.08"/>
              <div>Ну там решение очевидное. Только не уверен что очень нужно всюду jquery толкать. Все-таки 20-30К. Если больше ничего нет, проще ручками такой скрипт написать.</div>
            </li>
            <li id="a339" title="a0">
              <a name="&#x42F;&#x43C;&#x430;&#x43B;" title="" rel="26.09.09"/>
              <div>Фигня. Не стоит заморачиваться. <br/>Тема мертвая. Если за 10 лет после выпуска ie5 ничего с места не сдвинулось, значит и дальше не сдвинется. <br/>Клиентский XSLT - красивая и мертворожденная идея. Жаль. Но это так.</div>
            </li>
            <li id="a348" title="a339">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="22.10.09"/>
              <div>Если это так, пусть этот блог будет памятником мертворожденной идеи :)</div>
            </li>
          </ul>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

