Xpoint
   [напомнить пароль]

В дереве обрабатывается только один узел, почему не пойму

Метки: [без меток]
2013-03-23 16:51:19 [обр] Андрей[досье]
сообщение промодерировано

Здравствуйте!Впервые в жизни столкнулся с XML и XSL, не пойму в чём проблема.Есть XML-файл и к нему надо создать 2 XSL-файла, которые выводили бы его в 2х таких видах: http://imglink.ru/show-image.php?id=e1ceab60886b569689b12ae9087c8aba, т.е. просто вывести содержимое элемента каждого уровня разными цветами, и http://imglink.ru/show-image.php?id=9fa80236c9f54f2f2491872c8039118d, тут 1 и 2 столбцы значения атрибутов 1 и 2 уровней, а 3 столбец просто текст элемента 3го уровня.

XML:

<?xml version="1.0" encoding="WINDOWS-1251"?>
<?xml-stylesheet type='text/xsl' href='1-1.xsl'?>
<cars>
  <model>
    <name>BMW</name>
      <steeringwheel id1="Сторона1">
        <location>Левая</location>
          <color-list id2="Цвет1">
            <color>Красный</color>
              <transmission-list id3="Коробка1">
                <transmission>Механическая</transmission>
              </transmission-list>
          </color-list>
      </steeringwheel>
  </model>
  <model>
    <name>HONDA</name>
      <steeringwheel id1="Сторона2">
        <location>Правая</location>
          <color-list id2="Цвет2">
            <color>Синий</color>
              <transmission-list id3="Коробка2">
                <transmission>Механическая</transmission>
              </transmission-list>
          </color-list>
      </steeringwheel>
  </model>
  <model>
    <name>NISSAN</name>
      <steeringwheel id1="Сторона3">
        <location>Левая</location>
          <color-list id2="Цвет3">
            <color>Зелёный</color>
              <transmission-list id3="Коробка3">
                <transmission>Автоматическая</transmission>
              </transmission-list>
          </color-list>
      </steeringwheel>
  </model>
</cars>

1XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template  match="/" mode="tree">
<xsl:for-each select="cars/model/steeringwheel/color-list/transmission-list">
<p><strong><xsl:value-of select="//name"/></strong></p>
<B><font color="red"><strong><xsl:value-of select="//location"/></strong></font></B>
<B><font color="blue"><xsl:value-of select="//color"/></font></B>
<B><font color="green"><xsl:value-of select="//transmission"/></font></B>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Что выводится: http://imglink.ru/show-image.php?id=5d9621f6d5239e1ec4166b1dee5bee16
Тоесть, выводятся почему то значения 1го узла, но 3 раза.

2XSL:

<?xml version="1.0" encoding="WINDOWS-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/" mode="tree">
<table border="1">
  <tr bgcolor="red">
    <td align="center"><strong>Значения атрибутов элементов первого уровня</strong></td>
    <td align="center"><strong>Значения атрибутов элементов второго уровня</strong></td>
    <td align="center"><strong>Значения текста элементов третьего уровня</strong></td>
  </tr>
  <xsl:for-each select="cars/model/steeringwheel/color-list/transmission-list">
  <tr>
    <td><xsl:value-of select="//steeringwheel/@id1"/></td>
    <td> <xsl:value-of select="//color-list/@id2"/></td>
    <td><xsl:value-of select="transmission"/></td>
     </tr>
  </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

Что выводится: http://imglink.ru/show-image.php?id=eacdd4e3829c73773ef06c9106841678
Картина такая же, только тексты последних уровней вложенности обрабатываются нормально, а значения атрибутов предыдущих уровней(1 и 2 столбцы) опять только первоего узла!Не пойму что не так сделано(

спустя 17 часов [обр] Олег Торбасов(3/3)[досье]
Так Вы откуда внутри цикла пути отсчитываете? От корня. А надо — от текущего узла. Вот это — //steeringwheel — всегда и будет первый узел с таким именем. Надо как-то так (примерно): ./../../@id1 И вообще непонятно, зачем перебирать transmission-list, а не steeringwheel — так же было бы яснее и удобнее.
спустя 2 дня 5 часов [обр] Jared(0/26)[досье]

Андрей[досье]

<!-- xsl:for-each select="cars/model/steeringwheel/color-list/transmission-list" --> <!-- Неверно - не нужен нам тут именно список трансмиссий - нам нужна модель, оттуда возмем все что нужно -->

<xsl:for-each select="cars/model">
      <p><strong><xsl:value-of select=".//name"/></strong></p>
      <B><font color="red"><strong><xsl:value-of select=".//location"/></strong></font></B>
      <B><font color="blue"><xsl:value-of select=".//color"/></font></B>
      <B><font color="green"><xsl:value-of select=".//transmission"/></font></B>
</xsl:for-each>

XPath Конструкция "//nodename" возвращает нодсет из вообще всех нод "nodename" в документе. ".//nodename" - нодсет из всех нод в текущем контексте, то есть "под" текущим узлом. for-each на каждой иттерации меняет "текущий" узел.

Второй шаблон сами перепишете с новыми навыками.

Ну и в догонку, выкиньте на помойку этот ваш win1251. Выкиньте на помойку теги font, атрибуты в тегах (border, align, bgcolor etc..), этому веку уже второй десяток пошел, а вы все как в 98 году.
И напоследок - перепешите шаблоны без for-each, это даст довольно много в понимании, как работает XSLT.

спустя 3 часа 35 минут [обр] Lynn «Кофеман»(52/571)[досье]
У вас правда такой странный XML в котором трансмиссия лежит внутри рулевого колеса?
спустя 5 дней [обр] Андрей[досье]
Спасибо огромное!Разобрался)
Powered by POEM™ Engine Copyright © 2002-2005