Проблема с порядком обработки узлов

tashkentchi

Новичок
Проблема с порядком обработки узлов

Есть XML-ка следующего вида:
PHP:
<Данные_об_организации>
  <название>Аптека "36,6"</название>
  <режим_работы>
    <рабочие_дни_время>8.00-20.00, без обеда и без выходных</рабочие_дни_время>
  </режим_работы>
  <фактический_адрес>Узбекистан, г.Ташкент, Мирзо-Улугбекский район, ул. Буюк Ипак Юли, 105/2</фактический_адрес>
  <ориентиры>метро "Буюк Ипак Йули"</ориентиры>
  <транспорт>авт. 24, 1, 101, 63</транспорт>
  <телефоны>169-05-45, 68-15-09</телефоны>
  <орг_правовая_форма>Общество с ограниченной ответственностью (ООО)</орг_правовая_форма>
  <величина>микрофирма</величина>
  <ИНН>204790538</ИНН>
  <юридический_адрес>г. Ташкент, 700077 ул. Буюк Ипак Юли, 105/2</юридический_адрес>
  <ОКОНХ>71212</ОКОНХ>
  <счета>
    <счет>
      <номер>20208000804302736001</номер>
      <банк>Мирзо-Улугбекский филиал НБ ВЭД</банк>
      <МФО>00895</МФО>
    </счет>
  </счета>
  <категория>Аптеки</категория>
</Данные_об_организации>
В ней также могут быть и другие узлы, если соответствующие значения IS NOT NULL. Обрабатываем ее XSL-кой:
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
   <xsl:apply-templates/>
</xsl:template>
<xsl:template match="Данные_об_организации">
   <table width="100%" border="0">
      <xsl:apply-templates/>
   </table>
</xsl:template>
<xsl:template match="картинка">
   <tr><td colspan="2" align="center">
   <img border="0" width="160" height="100"><xsl:attribute name="src">
   <xsl:apply-templates/></xsl:attribute></img>
   </td></tr><tr><td>&#160;</td></tr>
</xsl:template>
<xsl:template match="название">
   <tr><td colspan="2" align="center" style="font-size:14px;color:#00439F;">
   <b><xsl:apply-templates/></b></td></tr>
   <tr><td>&#160;</td></tr>
</xsl:template>
<xsl:template match="дополнительная_информация">
   <tr><td class="green" colspan="2"><xsl:apply-templates/></td></tr>
</xsl:template>
<xsl:template match="фактический_адрес">
   <tr>
   <xsl:if test="position() mod 2 = 1">
      <xsl:attribute name="class">gridcolor</xsl:attribute>
   </xsl:if>
   <td class="green">Адрес</td>
   <td class="green" width="60%"><b><xsl:apply-templates/></b></td></tr>
</xsl:template>
<xsl:template match="ориентиры">
   <tr>
   <xsl:if test="position() mod 2 = 1">
      <xsl:attribute name="class">gridcolor</xsl:attribute>
   </xsl:if>
   <td class="green">Ориентиры</td>
   <td class="green" width="60%"><b><xsl:apply-templates/></b></td></tr>
</xsl:template>
<!-- и т.д. и т.п. -->
Работает неудовлетворительно, т.к. узел "категория" выводится последним, а должен быть первым. Явно прописать
PHP:
<xsl:apply-templates select="категория"/>
<xsl:apply-templates select="фактический_адрес"/>
<xsl:apply-templates select="ориентиры"/>
<!-- и т.д. -->
не могу, так как перестанет работать конструкция
PHP:
<xsl:if test="position() mod 2 = 1">
   <xsl:attribute name="class">gridcolor</xsl:attribute>
</xsl:if>
которая также необходима. Изменить XML-ку также не в моей воле. Так как с XSL пока не "на ты", то ломаю голову. Помогите, плиз.
 

chameleon

Новичок
Явно прописать
<xsl:apply-templates select="категория"/>...
категории достаточно...
PHP:
<xsl:template match="Данные_об_организации">
   <table width="100%" border="0">
      <xsl:apply-templates select="категория"/>
      <xsl:apply-templates select="node()[local-name()!='категория']"/>
   </table>
</xsl:template>
имхо ничего сломаться не должно...
 

tashkentchi

Новичок
Спасибо, работает. Но проблемы остаются:
Если "категория" выделить и поставить первой строчкой, "название" второй, "режим_работы" (если есть) третей и т.д., то
PHP:
position() mod 2 = 1
всегда выполняется. На выходе я получаю не "зебру" а таблицу с одинаковыми строками. Может быть заменить это выражение на что-то другое, но ничего путного не подберу.
 
Сверху