<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>XSLT- примеры. Вып.2  Подсчет суммы, количества, минимум/максимум</title>
    <meta name="css" content=""/>
    <meta name="js" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="22"/>
    <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> / XSLT- примеры. Вып.2  Подсчет суммы, количества, минимум/максимум</h1>
          <ol class="tags big">
            <li>
              <a href="/xslt-examples">xslt-examples</a>
            </li>
          </ol>
          <div class="myContent"><p>Пример: есть список книг, с указанием стоимости и дополнительный параметр - тип книги.</p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain"><p>&lt;books&gt;         <br/>    &lt;book author="Багряк П."  cost="123" type="old"&gt; Синие люди&lt;/book&gt;         <br/>    &lt;book author="Булгаков М."  cost="34" type="old"&gt; Роковые яйца&lt;/book&gt;         <br/>    &lt;book author="Чехов А.П."  cost="23" type="old"&gt; Чайка&lt;/book&gt;         <br/>    &lt;book author="Ленин В.И."  cost="344" type="old"&gt; Апрельские тезисы&lt;/book&gt;         <br/>    &lt;book author="Бондарев Ю."  cost="23" type="old"&gt;  Берег&lt;/book&gt;         <br/>    &lt;book author="Булгаков М."  cost="34" type="old"&gt; Собачье сердце&lt;/book&gt;         <br/>    &lt;book author="Донцова Д."  cost="237" type="new"&gt; Кулинар&lt;/book&gt;         <br/>    &lt;book author="Булгаков М."  cost="34" type="old"&gt; Бег&lt;/book&gt;         <br/>    &lt;book author="Чехов А.П."  cost="23" type="old"&gt; Палата #6&lt;/book&gt;         <br/>    &lt;book author="Лесков Н."  cost="744" type="old"&gt; Левша&lt;/book&gt;         <br/>    &lt;book author="Гаррисон Г."  cost="120" type="new"&gt; Мир Родины&lt;/book&gt;         <br/>    &lt;book author="Ленин В.И."  cost="344" type="old"&gt; Что делать&lt;/book&gt;         <br/>&lt;/books&gt;</p>
</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>Необходимо посчитать количество и стоимость  старых (old) и новых (new) книг, их общую стоимость, определить самую дорогую и самую дешевую из книг.</p>
<h2>Пример.1 Cумма и количество в XSLT</h2>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain"><p>&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;         <br/>    &lt;xsl:output  indent="yes"/&gt;         <br/>    &lt;xsl:template match="books"&gt;         <br/>        &lt;table&gt;      <br/>       &lt;tr&gt;      &lt;td&gt;         Товар&lt;/td&gt;      &lt;td&gt;      Количество&lt;/td&gt;      &lt;td&gt;         Стоимость&lt;/td&gt;      &lt;/tr&gt;         <br/>        &lt;tr&gt;         <br/>            &lt;td&gt;      Старые книги&lt;/td&gt;         <br/>            &lt;td&gt;      &lt;xsl:value-of select="count(book[@type = 'old']/@cost)"/&gt;      &lt;/td&gt;         <br/>            &lt;td&gt;      &lt;xsl:value-of select="sum(book[@type = 'old']/@cost)"/&gt;      &lt;/td&gt;         <br/>        &lt;/tr&gt;         <br/>            &lt;tr&gt;         <br/>                &lt;td&gt;      Новые книги&lt;/td&gt;         <br/>                &lt;td&gt;      &lt;xsl:value-of select="count(book[@type = 'new']/@cost)"/&gt;      &lt;/td&gt;         <br/>                &lt;td&gt;      &lt;xsl:value-of select="sum(book[@type = 'new']/@cost)"/&gt;      &lt;/td&gt;         <br/>            &lt;/tr&gt;         <br/>            &lt;tr&gt;         <br/>                &lt;td&gt;      Итого&lt;/td&gt;         <br/>                &lt;td&gt;      &lt;xsl:value-of select="count(book/@cost)"/&gt;      &lt;/td&gt;         <br/>                &lt;td&gt;      &lt;xsl:value-of select="sum(book/@cost)"/&gt;      &lt;/td&gt;         <br/>            &lt;/tr&gt;                     <br/>        &lt;/table&gt;         <br/>    &lt;/xsl:template&gt;         <br/> &lt;/xsl:stylesheet&gt;</p>
</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>Пример нуждается в комментариях? Вроде нет. Тогда переходим ко второму примеру, который решим двумя способами:</p>
<h2>Пример 2a. XSLT min/max по-тупому</h2>
<p>Определение минимума и максимума в традиционом програмировании решаются прогоном массива через цикл. В XSLT примерно то же самое, но со своими особенностями:</p>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain"><p>&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;         <br/>    &lt;xsl:output indent="yes"/&gt;         <br/>    &lt;xsl:template match="books"&gt;         <br/><br/>        &lt;xsl:for-each select="book/@cost"&gt;         <br/>            &lt;! -- задаем порядок сортировки по убыванию цены --&gt;         <br/>            &lt;xsl:sort data-type="number" order="descending"/&gt;         <br/>            &lt;! -- первый элемент выбранный в списке  - это максимум --&gt;         <br/>            &lt;xsl:if test="position()=1"&gt;     MAX:&lt;xsl:value-of select="."/&gt;     &lt;/xsl:if&gt;         <br/>        &lt;/xsl:for-each&gt;      <br/>        &lt;! -- повторение - мать учения. В принципе MAX можно <br/>        было воткнуть в предыдущий цикл --&gt;         <br/>        &lt;xsl:for-each select="book/@cost"&gt;         <br/>            &lt;xsl:sort data-type="number" /&gt;         <br/>            &lt;xsl:if test="position()=1"&gt;     MIN:&lt;xsl:value-of select="."/&gt;     &lt;/xsl:if&gt;         <br/>        &lt;/xsl:for-each&gt;         <br/>        <br/>    &lt;/xsl:template&gt;         <br/>&lt;/xsl:stylesheet&gt;</p>

</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<h2>Пример 2b. XSLT min/max вариант без использования for-each</h2>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain"><p>&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt;         <br/>    &lt;xsl:output indent="yes"/&gt;       <br/>   <br/>    &lt;xsl:template match="books"&gt;         <br/>        &lt;!--   организуем перебор книг без использования <br/>                оператора цикла. <br/>        --&gt;         <br/>        &lt;xsl:apply-templates &gt;         <br/>            &lt;!--   задаем направление перебора --&gt;         <br/>            &lt;xsl:sort data-type="number" order="descending" select="@cost "/&gt;           <br/>        &lt;/xsl:apply-templates&gt;         <br/>    &lt;/xsl:template&gt;         <br/><br/>&lt;xsl:template match="book"&gt;         <br/>    &lt;!--  отлавливаем первый и последний элементы списка book --&gt;         <br/>    &lt;xsl:choose&gt;         <br/>        &lt;xsl:when test="position()  = 1"&gt;         <br/>            MIIN:&lt;xsl:value-of select="@cost"/&gt;         <br/>        &lt;/xsl:when&gt;         <br/>        &lt;xsl:when test="position()   =  last() "&gt;         <br/>            MAX:&lt;xsl:value-of select="@cost"/&gt;         <br/>        &lt;/xsl:when&gt;         <br/>    &lt;/xsl:choose&gt;         <br/>    &lt;!--   а остальные элементы просто игнорируем  --&gt;         <br/>&lt;/xsl:template&gt;      <br/><br/>&lt;/xsl:stylesheet&gt;</p>
</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<p>Исходные коды в директории ex1 архива <a href="/doc/xslt-examples.zip">xslt-examples.zip</a></p></div>
          <ol class="tags big">
            <li class="date">2008-10-02</li>
            <li>
              <a href="/xslt-examples">xslt-examples</a>
            </li>
          </ol>
          <ol class="see"/>
          <ul class="comment">
            <li id="a112" title="a0">
              <a name="Le capitaine Nemo" title="" rel="03.10.08"/>
              <div>Если взялись учить XSLT то не нужно демонстрировать дурной стиль как в примере 2a.</div>
            </li>
            <li id="a113" title="a112">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x447;&#x430;&#x432;" title="erum.ru" rel="03.10.08"/>
              <div>Вообще-то я ни за что не брался. Примеры из моих архивов, когда я сам учился. И когда сам спотыкался на XSLT-головоломках.<br/>2a - пример тупого подхода, и я это написал в заголовке. Но он более-менее понятен любому, кто умеет писать на каком-нибудь языке программирования. В отличие от примера 2b.</div>
            </li>
            <li id="a117" title="a0">
              <a name="Ravell" title="" rel="08.10.08"/>
              <div>Спасибо за статью. Два примера - один 2а, а другой.... тоже 2а :)</div>
            </li>
            <li id="a133" title="a113">
              <a name="Le capitaine Nemo" title="" rel="14.10.08"/>
              <div>Если пример 2b  непонятен нефиг вообще лезть.</div>
            </li>
            <li id="a135" title="a117">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="14.10.08"/>
              <div>Спасибо на добром слове. Ошибку поправил.</div>
            </li>
            <li id="a243" title="a133">
              <a name="Grundiss" title="" rel="19.02.09"/>
              <div>Не согласен категорически! Надо с чего-то начинать. Для новичков структура Фор-Ич более понятна, так как перекликается с традиционными ЯП.<br/>По поводу "нефиг вообще лезть". Как вы думаете, кто основная аудитория раздела? НУБЫ! Или вы всерьез полагаете, что акулам XSLT будет полезна статья "Как найти сумму..."?</div>
            </li>
            <li id="a486" title="a0">
              <a name="Le capitaine Nemo" title="" rel="27.03.10"/>
              <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>

