<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; XSL</title>
	<atom:link href="http://blog.sjinks.pro/tag/xsl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Генерация карты сайта в HTML из XML: часть 3</title>
		<link>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/</link>
		<comments>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 00:30:50 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Google XML Sitemaps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSL]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[преобразование]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=854</guid>
		<description><![CDATA[Автоматизация: перекладываем работу на Google XML Sitemaps Продолжение цикла статей на тему генерации карты сайта в HTML из карты XML. В данной статье будет рассмотрен вопрос модификации плагина Google XML Sitemaps с целью добавления поддержки автоматической генерации HTML-версии карты сайта; как и в предыдущих статьях, преобразование будет осуществляться средствами XSL. В первой части статьи мы [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Автоматизация: перекладываем работу на Google <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a> Sitemaps</em></h2>
<p>Продолжение <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">цикла</a> <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">статей</a> на тему <a href="/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BA%D0%B0%D1%80%D1%82%D1%8B%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%D0%B2%20HTML%20%D0%B8%D0%B7%20XML/">генерации карты сайта в HTML из карты XML</a>.</p>
<p>В данной статье будет рассмотрен вопрос модификации плагина <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/">Google XML Sitemaps</a> с целью добавления поддержки автоматической генерации <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>-версии карты сайта; как и в предыдущих статьях, <a href="http://blog.sjinks.pro/tag/conversion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  преобразование">преобразование</a> будет осуществляться средствами <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>.<span id="more-854"></span></p>
<p>В <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">первой части</a> статьи мы рассматривали вариант, основанный на использовании утилиты <code>xsltproc</code>. Предполагалось, что генерация HTML-версии карты сайта осуществляется с использованием <code>cron</code>. Создание карты по расписанию означает, что построение HTML-карты будет запаздывать на некоторое время; а если не сравнивать время модификации XML- и HTML-версий карт, получим бесполезные вызовы <code>xsltproc</code>.</p>
<p>Те, кто используют <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, очень часто для автоматического построения карты сайта используют <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google XML Sitemaps">Google XML Sitemaps</a>; для них предлагается вариант с модификацией кода плагина для автоматической генерации HTML-карты.</p>
<p>Плагин позволяет задавать свою таблицу стилей XSLT:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options-300x56.png" alt="Настройки Google XML Sitemaps" title="Настройки Google XML Sitemaps" width="300" height="56" class="alignnone size-medium wp-image-855" /></a></p>
<p>Мы изменим плагин таким образом, чтобы при заданной таблице стилей XSL плагин создавал HTML-файл с результатами преобразований XSL.</p>
<p>В файле <code>sitemap-core.php</code> ищем такой кусок кода:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8544">
        <div class="code php" id="p854code4">
<ol class="php" style="font-family:monospace;" start="2169"><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st0">&quot;b_xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">&amp;&amp;</span> <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pingUrl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="sy0">,</span><span class="st0">&quot;Could not close the sitemap file.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>После него добавляем такой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8545">
        <div class="code php" id="p854code5">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">class_exists</span><span class="br0">&#40;</span><span class="st_h">'XSLTProcessor'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$file</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$styleSheet</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style_default'</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw4">true</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span> <span class="sy0">=</span> <span class="kw2">new</span> XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">importStyleSheet</span><span class="br0">&#40;</span><span class="re0">$xsl</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">transformToURI</span><span class="br0">&#40;</span><span class="re0">$xml</span><span class="sy0">,</span> <span class="st_h">'file://'</span> <span class="sy0">.</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'.xml'</span><span class="sy0">,</span> <span class="st_h">'.html'</span><span class="sy0">,</span> <span class="re0">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Данный код требует PHP 5 и расширения XSLT (в Debian/Ubuntu оно предоставляется пакетом <code>php5-xsl</code>). Код получает имя файла с картой сайта и адрес таблицы стилей (этот адрес должен быть задан абсолютным URL); XML и XSL скармливаются XSLT Processor&#8217;у, результат записывается в файл с тем же именем, что и карта сайта XML, но с расширением <code>.html</code>.</p>
<p>Теперь при каждом построении карты сайта будет создаваться и HTML-версия.</p>
<p>Тем, кто любит патчи (<a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> кумулятивный, исправляет и некоторые другие недостатки плагина):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8546">
        <div class="code diff" id="p854code6">
--- sitemap-core.php.orig &nbsp; 2010-08-16 10:49:16.000000000 +0300<br />
<span class="re4">+++ sitemap-core.php&nbsp; &nbsp; <span class="nu0">2010</span>-<span class="nu0">11</span>-<span class="nu0">28</span> 02:<span class="nu0">10</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">1654</span>,<span class="nu0">9</span> +<span class="nu0">1654</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorXmlEntry<span class="br0">&#40;</span>'&lt;' . '?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;' . $styleSheet . '&quot;?' . '&gt;'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //All comments as an asso. Array <span class="br0">&#40;</span>postID=&gt;commentCount<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $comments=<span class="br0">&#40;</span>$this-&gt;GetOption<span class="br0">&#40;</span>&quot;b_prio_provider&quot;<span class="br0">&#41;</span>!=&quot;&quot;?$this-&gt;GetComments<span class="br0">&#40;</span><span class="br0">&#41;</span>:array<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">2172</span>,<span class="nu0">6</span> +<span class="nu0">2172</span>,<span class="nu0">22</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $status-&gt;EndXml<span class="br0">&#40;</span>true<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $pingUrl=$this-&gt;GetXmlUrl<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> else $status-&gt;EndXml<span class="br0">&#40;</span>false,&quot;Could not close the sitemap file.&quot;<span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>class_exists<span class="br0">&#40;</span>'XSLTProcessor', true<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $file &nbsp; &nbsp; &nbsp; = $this-&gt;GetXmlPath<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $styleSheet = <span class="br0">&#40;</span>$this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; $this-&gt;GetOption<span class="br0">&#40;</span>'b_style_default'<span class="br0">&#41;</span> === true ? $this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> : $this-&gt;GetOption<span class="br0">&#40;</span>'b_style'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>!empty<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl-&gt;load<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml-&gt;load<span class="br0">&#40;</span>$file<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc = new XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;importStyleSheet<span class="br0">&#40;</span>$xsl<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;transformToURI<span class="br0">&#40;</span>$xml, 'file://' . str_replace<span class="br0">&#40;</span>'.xml', '.html', $file<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if<span class="br0">&#40;</span>$this-&gt;IsGzipEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">2514</span>,<span class="nu0">9</span> +<span class="nu0">2530</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp;* @return int The time in seconds<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; function GetTimestampFromMySql<span class="br0">&#40;</span>$mysqlDateTime<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return mktime<span class="br0">&#40;</span>intval<span class="br0">&#40;</span>$hour<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$min<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$sec<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$month<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$day<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$year<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML: часть 2</title>
		<link>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/</link>
		<comments>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 12:04:38 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=849</guid>
		<description><![CDATA[Как сделать не более N ссылок на файл Продолжение статьи «Генерация карты сайта в HTML из XML». В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок. Нам понадобятся: XSL из статьи «Преобразование карты сайта в список адресов для siege»: &#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62; &#60;xsl:stylesheet version=&#34;1.0&#34; xmlns:xsl=&#34;http://www.w3.org/1999/XSL/Transform&#34; [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как сделать не более N ссылок на файл</em></h2>
<p>Продолжение статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>.</p>
<p>В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок.<span id="more-849"></span></p>
<p>Нам понадобятся:</p>
<ul>
<li><a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a> из статьи <strong>«<a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">Преобразование карты сайта в список адресов для siege</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84910">
        <div class="code xml" id="p849code10">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;text&quot;</span> <span class="re0">media-type</span>=<span class="st0">&quot;text-plain&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;no&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:text<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#x000A;</span><span class="sc3"><span class="re1">&lt;/xsl:text<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>XSL из статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84911">
        <div class="code xml" id="p849code11">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">exclude-result-prefixes</span>=<span class="st0">&quot;x&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;xml&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;yes&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">doctype-public</span>=<span class="st0">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="re0">doctype-system</span>=<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Site Map<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;h1<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;http://blog.sjinks.pro/&quot;</span><span class="re2">&gt;</span></span>Карта сайта<span class="sc3"><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/h1<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:apply-templates</span> <span class="re0">select</span>=<span class="st0">&quot;x:url&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;li<span class="re2">&gt;</span></span><span class="re1">&lt;strong<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;{x:loc}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/strong<span class="re2">&gt;</span></span><span class="re1">&lt;/li<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>Немного фантазии <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Алгоритм работы простой:</p>
<ol>
<li>Преобразовываем исходную карту в текстовый список адресов (один URL на строку)</li>
<li><a href="http://linux.die.net/man/1/split">Разбиваем</a> файл на несколько частей с заданным количеством строк</li>
<li>Преобразовываем каждый из полученных файлов в <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a></li>
<li>Преобразовываем полученные XML-файлы в <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a></li>
</ol>
<p>Пункты 3 и 4 можно совместить: вместо генерации XML-файла можно сразу генерировать HTML. Но на всякий случай будем генерировать и XML, и HTML.</p>
<p>Получим такой скрипт:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84912">
        <div class="code bash" id="p849code12">
<span class="co0">#! /bin/sh</span><br />
<br />
xsltproc <span class="re5">-o</span> urls.txt sitemap2txt.xsl sitemap.xml<br />
<span class="kw2">split</span> <span class="re5">-d</span> <span class="re5">-l</span> 100 urls.txt map<br />
<span class="kw1">for</span> i <span class="kw1">in</span> map<span class="sy0">*</span>; <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw2">awk</span> <span class="st_h">'<br />
&nbsp; &nbsp; BEGIN {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;?xml version=\&quot;1.0\&quot;?&gt;\<br />
&lt;urlset\<br />
&nbsp; &nbsp; xmlns:xsi=\&quot;http://www.w3.org/2001/XMLSchema-instance\&quot;\<br />
&nbsp; &nbsp; xsi:schemaLocation=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\&quot;\<br />
&nbsp; &nbsp; xmlns=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9\&quot;&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;url&gt;&lt;loc&gt;&quot;$1&quot;&lt;/loc&gt;&lt;/url&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; END {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;/urlset&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; '</span> <span class="re1">$i</span> <span class="sy0">&gt;</span> site<span class="re1">$i</span>.xml<br />
&nbsp; &nbsp; xsltproc <span class="re5">-o</span> site<span class="re1">$i</span>.html sitemap2html.xsl site<span class="re1">$i</span>.xml<br />
<span class="kw1">done</span>
        </div>
    </div>
</div>

<p>Всё просто!™</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML</title>
		<link>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/</link>
		<comments>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 01:22:20 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=847</guid>
		<description><![CDATA[Помогаем ботам найти все страница сайта Проблема: есть достаточно большой сайт, у которого есть карта в формате XML. Есть бот, который этот сайт индексирует. Но бот не может найти страницы, имеющие уровень вложенности больше трёх. Нужно помочь боту проиндексировать весь сайт. Самый простой способ — создание страницы, в которой будут перечислены все страницы сайта и размещение на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Помогаем ботам найти все страница сайта</em></h2>
<p><strong>Проблема:</strong> есть достаточно большой сайт, у которого есть <a href="/sitemap.xml">карта в формате XML</a>. Есть бот, который этот сайт индексирует. Но бот не может найти страницы, имеющие уровень вложенности больше трёх. Нужно помочь боту проиндексировать весь сайт.</p>
<p>Самый простой способ — создание страницы, в которой будут перечислены все страницы сайта и размещение на неё ссылки из подвала сайта. Идеальный кандидат на такую страницу — карта сайта в формате <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a>. Проблема в том, что не все боты утруждают себя разбором <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a>-карт. Для таких ботов карту нужно преобразовывать в формат <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>.<span id="more-847"></span></p>
<p>Как и в <a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">другом похожем случае</a>, на помощь приходит <a href="http://blog.sjinks.pro/tag/conversion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  преобразование">преобразование</a> <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>.</p>
<p>Пример шаблона стилей XML:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84715">
        <div class="code xml" id="p847code15">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">exclude-result-prefixes</span>=<span class="st0">&quot;x&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;xml&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;yes&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">doctype-public</span>=<span class="st0">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="re0">doctype-system</span>=<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Site Map<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;h1<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;http://blog.sjinks.pro/&quot;</span><span class="re2">&gt;</span></span>Карта сайта<span class="sc3"><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/h1<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:apply-templates</span> <span class="re0">select</span>=<span class="st0">&quot;x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:sort</span> <span class="re0">select</span>=<span class="st0">&quot;lastmod&quot;</span> <span class="re0">order</span>=<span class="st0">&quot;descending&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:apply-templates<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;li<span class="re2">&gt;</span></span><span class="re1">&lt;strong<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;{x:loc}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/strong<span class="re2">&gt;</span></span><span class="re1">&lt;xsl:if</span> <span class="re0">test</span>=<span class="st0">&quot;x:lastmod&quot;</span><span class="re2">&gt;</span></span> (<span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:lastmod&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span>)<span class="sc3"><span class="re1">&lt;/xsl:if<span class="re2">&gt;</span></span><span class="re1">&lt;/li<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

<p>Преобразование выполняется так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84716">
        <div class="code bash" id="p847code16">
xsltproc <span class="re5">-o</span> <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap.html <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap2html.xml <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap.xml
        </div>
    </div>
</div>

<p>Можно выполнение <code>xsltproc</code> повесить на крон и наслаждаться результатом.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Преобразование карты сайта в список адресов для siege</title>
		<link>http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/</link>
		<comments>http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 07:32:18 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=722</guid>
		<description><![CDATA[Использование XSL-преобразований для перевода XML в текст Siege — утилита для нагрузочного тестирования web-серверов, целью которой является дать разработчикам возможность проверить быстродействие/ресурсоёмкость кода в условиях, максимально приближенных к реальным. В режимах регрессионного тестирования и «имитации Internet» siege использует текстовый файл со списком адресов для тестирования. В качестве такого файла очень удобно было бы использовать карту сайта (sitemap), [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Использование <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>-преобразований для перевода <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a> в текст</em></h2>
<p><a href="http://joedog.org/index/siege-home">Siege</a> — утилита для нагрузочного тестирования web-серверов, целью которой является дать разработчикам возможность проверить быстродействие/ресурсоёмкость кода в условиях, максимально приближенных к реальным.</p>
<p>В режимах регрессионного тестирования и «имитации Internet» <code>siege</code> использует текстовый файл со списком адресов для тестирования.</p>
<p>В качестве такого файла очень удобно было бы использовать карту сайта (sitemap), но, к сожалению, <code>siege</code> не понимает XML. В данной статье рассмотрено одно из возможных решений по преобразованию карты сайта из XML в текстовый формат.<span id="more-722"></span></p>
<p>Как уже было отмечено, карта сайта представляет собой XML-файл, формат которого подробно описан <a href="http://www.sitemaps.org/protocol.php">здесь</a>. Задача заключается в преобразовании XML-файла в текстовый формат (каждый адрес в отдельной строке и без лишних пробелов).</p>
<p>Самый надёжный способ — использование «родных» для XML XSL-преобразований. В отличие от регулярных выражений XSL-преобразования будут правильно работать даже в том случае, если используется расширенный формат карты (с элементами из других пространств имён).</p>
<p>Для преобразования понадобится данный XSL-файл:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p72221">
        <div class="code xml" id="p722code21">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;text&quot;</span> <span class="re0">media-type</span>=<span class="st0">&quot;text-plain&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;no&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:text<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#x000A;</span><span class="sc3"><span class="re1">&lt;/xsl:text<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

<p>Элемент <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;xsl:output<span class="re2">&gt;</span></span></span></code></span> задаёт формат результата (обычный текст), <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span></code></span> указывает, что у всех элементов нужно удалять лишние пробельные символы, а секция <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;xsl:template</span><span class="re2">/&gt;</span></span></code></span> делает выборку по всем блокам <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span></code></span> и собирает значения элементов <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;loc<span class="re2">&gt;</span></span></span></code></span>, добавляя новую строку (<span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;xsl:text<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#x000A;</span><span class="sc3"><span class="re1">&lt;/xsl:text<span class="re2">&gt;</span></span></span></code></span>) после каждого адреса.</p>
<p>Загружаем файл и натравливаем <span class="codebox"><code class="bash">xsltproc</code></span> на сайтмап (например, sitemap.xml):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p72222">
        <div class="code bash" id="p722code22">
xsltproc sitemap2txt.xml sitemap.xml <span class="re5">-o</span> urls.txt
        </div>
    </div>
</div>

<p>Вуаля, список готов. Важно, чтобы карта сайта <em>не содержала</em> директив <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;?xml-stylesheet</span> <span class="re2">?&gt;</span></span></code></span>.</p>
<p>Помимо XSL-преобразований есть еще способ с использованием потокового редактора <span class="codebox"><code class="bash"><span class="kw2">sed</span></code></span>, но способ достаточно хрупкий. Представляет собой типичный пример использования чёрной магии.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p72223">
        <div class="code bash" id="p722code23">
<span class="co0">#! /bin/sh</span><br />
<br />
<span class="kw2">sed</span> <span class="re5">-r</span> <span class="st_h">'s/&lt;loc/\n&lt;loc/g; s!&lt;/loc&gt;!&lt;/loc&gt;\n!g'</span> $1 <span class="sy0">|</span> <span class="kw2">sed</span> <span class="re5">-r</span> <span class="re5">-n</span> <span class="st_h">'/&lt;loc&gt;.*?&lt;\/loc&gt;/! D; /&lt;loc&gt;.*?&lt;\/loc&gt;/ s!&lt;/?loc&gt;!!g; s!\s+!!g; P'</span>
        </div>
    </div>
</div>

<p>Работает эта магия следующим образом: перед всеми открывающими тэгами и после всех закрывающих тэгов <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;/loc<span class="re2">&gt;</span></span></span></code></span> добавляется символ новой строки — это делается для того, чтобы все адреса гарантированно располагались на разных строках. Результат отдаётся второму <span class="codebox"><code class="bash"><span class="kw2">sed</span></code></span>, работающему в «бесшумном» режиме. Удаляется всё, что <em>не</em> находится внутри тэгов <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;loc<span class="re2">&gt;</span></span></span>…<span class="sc3"><span class="re1">&lt;/loc<span class="re2">&gt;</span></span></span></code></span>, затем удаляются сами тэги <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;loc<span class="re2">&gt;</span></span></span></code></span> и, наконец, удаляются лишние пробелы и выводится результат.</p>
<p>Работает так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p72224">
        <div class="code bash" id="p722code24">
sitemap2list.sh sitemap.xml <span class="sy0">&gt;</span> list.txt
        </div>
    </div>
</div>

<p>Не будет работать, если пространство имён по умолчанию не <span class="codebox"><code class="text">http://www.sitemaps.org/schemas/sitemap/0.9</code></span>, а также если блок <span class="codebox"><code class="xml"><span class="sc3"><span class="re1">&lt;loc<span class="re2">&gt;</span></span></span>…<span class="sc3"><span class="re1">&lt;/loc<span class="re2">&gt;</span></span></span></code></span> располагается на нескольких строках. XSLT всё-таки лучше.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

