Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > выбор данных по атрибуту и запись в таблыцу


Автор: RastaDja 13.9.2011, 13:34
Доброго времени суток!
Есть такой XML
Код

<results>
    <collection>
      <coll name="Коллекция 1" caption="Результат 1">
        <coll_result>
          <result_param name="Massa" value="4.80" caption="Масса" />
          <result_param name="Len" value="156.007982" caption="Длина" />
        </coll_result>
        <coll_result>
          <result_param name="Massa" value="0.003" caption="Масса" />
          <result_param name="Len" value="20.008012" caption="Длина"  />
        </colls_result>
      </coll>
    </collection>
  </results>


как я могу построить такую таблицу?

    |    Масса            |    Длина             |
    |    4.80               |     156.007982   |
    |    0.003             |     20.008012     |

заголовки в таблице "Масса" и "Длина", я задаю вручную, а вот как мне из  <coll_result>  достать за один раз данные из <result_param> по атрибуту name не понимаю. Помогите разобратся.

Надеюсь понятно описал проблему?
Спасибо.

ЗЫ: С XSLT ранее не работал, поэтому прошу помощи.

Автор: джун 13.9.2011, 16:29
http://www.w3schools.com/xsl/xsl_for_each.asp
http://www.w3schools.com/xsl/xsl_apply_templates.asp

Автор: RastaDja 13.9.2011, 16:37
сделал сам.
Предлагаю часть кода
Код

<xsl:for-each select="coll_result">
        <tr>
            <td>
                  <xsl:for-each select="result_param">
                    <xsl:if test="@name='Massa'">
                      <xsl:value-of select="@value"/>
                    </xsl:if>
                  </xsl:for-each>
            </td>
            <td>
                  <xsl:for-each select="result_param">
                    <xsl:if test="@name='Len'">
                      <xsl:value-of select="@value"/>
                    </xsl:if>
                  </xsl:for-each>
             </td>
        <tr>
      </xsl:for-each>

   может есть более изящное решение? Имею ввиду с меньшим количеством циклов, так как сейчас количество обходов равно (количеству coll_result )*(количество result_param)*(число проверок), например, в выше приведенном примере будет 8 проходов, а если данынных много, то и проходов будет много smile .

Добавлено через 3 минуты и 12 секунд
Цитата(джун @  13.9.2011,  17:29 Найти цитируемый пост)
http://www.w3schools.com/xsl/xsl_for_each.asp
http://www.w3schools.com/xsl/xsl_apply_templates.asp 

Это немного не то, но все-же спасибо.

Автор: diadiavova 13.9.2011, 18:45
По атрибуту данные можно выбрать таким выражением
Код

result_param[@name = 'Massa']

Автор: RastaDja 13.9.2011, 20:48
diadiavova, a как это в коде выглядит? Если я не ошибаюсь, то таким выражением мы достаним данные с узла, а как достать данные с атрибута value, при условии, что атрибут name=`myname`. Во это я не знаю, а нужно именно это. Есто ли другой способ, чем тот что япредложил?  если есть вокажите в коде.
С уважением RDja

Автор: diadiavova 13.9.2011, 21:05
Цитата(RastaDja @  13.9.2011,  21:48 Найти цитируемый пост)
а как достать данные с атрибута value, при условии, что атрибут name=`myname`

Код

elementname[@name = 'myname']/@value

Автор: RastaDja 14.9.2011, 08:34
diadiavova, спасибо за помощь(+).
Код

<xsl:for-each select="coll_result">
  <tr>
    <td>
      <xsl:value-of select="result_param[@name = 'Massa']/@value"/>
    </td>
    <td>
      <xsl:value-of select="result_param[@name = 'Len']/@value"/>
    </td>
  <tr>
</xsl:for-each

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)