xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Как из множества выбрать конкретное значение


Автор Сообщение
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13626] Вт Мар 17, 2009 23:15
Как из множества выбрать конкретное значение
Нужно (на пальцах):

Код:


<Smths>
   <Smth Id="1">1st</Smth>
   <Smth Id="2">2nd</Smth>
   <Smth Id="3">3rd</Smth>
   <Smth Id="4">4th</Smth>
   <Smth Id="5">5th</Smth>
</Smths>


запихнуть в колонку в таблице

Код:


Smth1,1st
Smth2,2nd
Smth3,3rd
Smth4,4th
Smth5,5th


в гольову ничего, кроме как а-ля (на пальцах):

Код:


<table>
   <tr>
      <td>Smth1</td>
      <td>
         <xsl:for-each select="Smths">
            <xsl:if test="@Id=1">.</xsl:if>
         </xsl:for-each>
      </td>
   </tr>
   <tr>
      <td>Smth2</td>
      <td>
         <xsl:for-each select="Smths">
            <xsl:if test="@Id=2">.</xsl:if>
         </xsl:for-each>
      </td>
   </tr>
   ...
   <tr>
      <td>Smth5</td>
      <td>
         <xsl:for-each select="Smths">
            <xsl:if test="@Id=5">.</xsl:if>
         </xsl:for-each>
      </td>
   </tr>
</table>


||

Код:


<table>
   <tr>
      <td>Smth1</td>
      <td>
         <xsl:for-each select="Smths/Smth@Id=1">.</xsl:for-each>
      </td>
   </tr>
   <tr>
      <td>Smth2</td>
      <td>
         <xsl:for-each select="Smths/Smth@Id=2">.</xsl:for-each>
      </td>
   </tr>
   ...
   <tr>
      <td>Smth5</td>
      <td>
         <xsl:for-each select="Smths/Smth@Id=5">.</xsl:for-each>
      </td>
   </tr>
</table>


но все это как-то ректально выглядит... Как это можно сделать по-людськи?
_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13628] Ср Мар 18, 2009 00:34

Код:

<table>
   <xsl:for-each select="Smths/Smth">
      <tr>
         <td>
           <xsl:value-of select="concat('Smth', @Id)"/>
         </td>
         <td>
           <xsl:value-of select="."/>
         </td>
     </tr>
   </xsl:for-each>
</table>


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13631] Ср Мар 18, 2009 09:32

I'm so sorry... Плохо обЪяснил. Левая колонка таблицы УЖЕ заполнена изначально в шаблоне статической информацией. Причем там все, что угодно м.б. Smth - то я так. Для примера. В общем виде:
Таблица ДО:

Код:


+------+---+
|qwerty|   |
+------+---+
|asdfgh|   |
+------+---+
|zxcvbn|   |
+------+---+


Таблица ПОСЛЕ:

Код:


+------+---+
|qwerty| 2 |
+------+---+
|asdfgh| 3 |
+------+---+
|zxcvbn| 1 |
+------+---+


_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13632] Ср Мар 18, 2009 22:42

Вариант 1 - <xsl:choose>
Вариант 2 - msxsl:node-set()
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13634] Чт Мар 19, 2009 18:20

Vasilisk писал(а):


1 - <xsl:choose>


Гм... Ну и чем это

Код:


<tr>
   <td>Value 1</td>
   <td>
      <xsl:for-each select="value">
         <xsl:choose>
            <xsl:when test="@id=1">
               <xsl:value-of select="." />
            </xsl:when>
         </xsl:choose>
      </xsl:for-each>
   </td>
</tr>


отличается от:

Код:


<tr>
   <td>Value 1</td>
   <td>
      <xsl:for-each select="value">
         <xsl:if test="@id=1">
            <xsl:value-of select="." />
         </xsl:if>
      </xsl:for-each>
   </td>
</tr>


???

Vasilisk писал(а):


2 - msxsl:node-set()


Исходя из msxsl, я так понял - это какая-то M$'совская весчЪ?
_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13636] Чт Мар 19, 2009 23:12

Ex_Soft писал(а):

Гм... Ну и чем это

Код:

<tr>
   <td>Value 1</td>
   <td>
      <xsl:for-each select="value">
         <xsl:choose>
            <xsl:when test="@id=1">
               <xsl:value-of select="." />
            </xsl:when>
         </xsl:choose>
      </xsl:for-each>
   </td>
</tr>


отличается от:

Код:

<tr>
   <td>Value 1</td>
   <td>
      <xsl:for-each select="value">
         <xsl:if test="@id=1">
            <xsl:value-of select="." />
         </xsl:if>
      </xsl:for-each>
   </td>
</tr>

???


А если так?

Код:

<xsl:for-each select="value">
  <tr>
    <td>
      <xsl:choose>
        <xsl:when test="@id=1">
          Value 1
        </xsl:when>
        <xsl:when test="@id=2">
          Value 2
        </xsl:when>
        ..................
      </xsl:choose>
    </td>
    <td>
      <xsl:value-of select="."/>
    </td>
  </tr>
</xsl:for-each>


Ex_Soft писал(а):

Vasilisk писал(а):

2 - msxsl:node-set()


Исходя из msxsl, я так понял - это какая-то M$'совская весчЪ?


Да, но подобные функции есть во многих парсерах
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13638] Чт Мар 19, 2009 23:49

Vasilisk писал(а):


А если так?


Не... Ситуация с точностью до наоборот: не данные управляют видом шаблона, а шаблон размещает данные куда необходимо.
_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13639] Пт Мар 20, 2009 00:57

Ex_Soft писал(а):

Не... Ситуация с точностью до наоборот: не данные управляют видом шаблона, а шаблон размещает данные куда необходимо.

В чем принципиальная разница?
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13642] Пт Мар 20, 2009 09:15

Vasilisk писал(а):


В чем принципиальная разница?


Порядок следования value в xml - неопределен. Соответственно мы каждый раз будем иметь разный random'ный вид на выходе. С таким же успехом можно было вообще не заморачиваться и возвращать пару ValueName-Value прям в xml'ине. Требуется же зафиксировать расположение ValueName вне зависимости от порядка/наличия в xml.

Код:


<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="TestRightColumn.xsl"?>
<root>
   <value id="1">value_1</value>
   <value id="3">value_3</value>
   <value id="2">value_2</value>
</root>


Код:


<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" encoding="windows-1251" />
   <xsl:template match="root">
      <html>
         <head>
            <title>Test Right Column</title>
         </head>
         <body>
            <table border="1">
               <tr>
                  <td>Value 2</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:if test="@id=2">
                           <xsl:value-of select="." />
                        </xsl:if>
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 3</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:if test="@id=3">
                           <xsl:value-of select="." />
                        </xsl:if>
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 1</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:if test="@id=1">
                           <xsl:value-of select="." />
                        </xsl:if>
                     </xsl:for-each>
                  </td>
               </tr>
            </table>
            <hr />
            <table border="1">
               <tr>
                  <td>Value 2</td>
                  <td>
                     <xsl:for-each select="value[@id=2]">
                        <xsl:value-of select="." />
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 3</td>
                  <td>
                     <xsl:for-each select="value[@id=3]">
                        <xsl:value-of select="." />
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 1</td>
                  <td>
                     <xsl:for-each select="value[@id=1]">
                        <xsl:value-of select="." />
                     </xsl:for-each>
                  </td>
               </tr>
            </table>
            <hr />
            <table border="1">
               <tr>
                  <td>Value 2</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:choose>
                           <xsl:when test="@id=2">
                              <xsl:value-of select="." />
                           </xsl:when>
                        </xsl:choose>
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 3</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:choose>
                           <xsl:when test="@id=3">
                              <xsl:value-of select="." />
                           </xsl:when>
                        </xsl:choose>
                     </xsl:for-each>
                  </td>
               </tr>
               <tr>
                  <td>Value 1</td>
                  <td>
                     <xsl:for-each select="value">
                        <xsl:choose>
                           <xsl:when test="@id=1">
                              <xsl:value-of select="." />
                           </xsl:when>
                        </xsl:choose>
                     </xsl:for-each>
                  </td>
               </tr>
            </table>
            <hr />
            <table border="1">
               <xsl:for-each select="value">
                  <tr>
                     <td>
                        <xsl:choose>
                           <xsl:when test="@id=1">
                              Value 1
                           </xsl:when>
                           <xsl:when test="@id=2">
                              Value 2
                           </xsl:when>
                           <xsl:when test="@id=3">
                              Value 3
                           </xsl:when>
                        </xsl:choose>

                     </td>
                     <td>
                        <xsl:value-of select="." />
                     </td>
                  </tr>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>


Последняя таблица, как раз, демонстрирует зависимость выхлопа от xml.
_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13646] Пт Мар 20, 2009 22:34

Ex_Soft писал(а):

Порядок следования value в xml - неопределен. Соответственно мы каждый раз будем иметь разный random'ный вид на выходе. С таким же успехом можно было вообще не заморачиваться и возвращать пару ValueName-Value прям в xml'ине. Требуется же зафиксировать расположение ValueName вне зависимости от порядка/наличия в xml.


<xsl:sort> религия не позволяет использовать?
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13648] Сб Мар 21, 2009 08:10

Vasilisk писал(а):


<xsl:sort> религия не позволяет использовать?


Ну и к чему ее применять-то? Если нуна

Код:


+------+---+
|qwerty| 2 |
+------+---+
|asdfgh| 3 |
+------+---+
|zxcvbn| 1 |
+------+---+


??? Левый столбец (описание) сторого фиксирован. А уж какие ID'шки под это дело получатся в правом - неизвестно никому.
_________________
"Helo, word!" - 17 errors 56 warnings
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13649] Вс Мар 22, 2009 00:40

Ex_Soft писал(а):

А уж какие ID'шки под это дело получатся в правом - неизвестно никому.


Вы думаете, что Вы пишете? Если это никому неизвестно, то порядок может быть полностью произвольный
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Ex_Soft
Новичок

Зарегистрирован: 13.03.2009
Сообщения: 12

[13650] Вс Мар 22, 2009 09:21

Vasilisk писал(а):


Если это никому неизвестно, то порядок может быть полностью произвольный


Не совсем так. Конечно, с полной неопределенностью, я, как говорится, перегнул палку. Дело обстоит так: ЭстЪ выходной строго фиксированный шаблон. Менять расположение строк в левом столбце - нельзя. А то, что стоит в правом добавлялось в БД в таблицу с identity. Причем в разное время (главное, что не подряд одно за другим). Соответственно ID'шки получаются разные, разбросанные, и, самое главное - в контексте сортировки - могут быть расположены не монотонно увеличиваясь/уменьшаясь в привязке к фиксированному левому столбцу.
_________________
"Helo, word!" - 17 errors 56 warnings