Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Пара вопросов по иерархическим структурам / 7 сообщений из 7, страница 1 из 1
25.12.2011, 17:21
    #37592629
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
Есть XML произвольной вложенности; корнем является Tree, который содержит коллекцию Item. Item может содержать коллекцию Group. Group может содержать коллекцию Item.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Tree>
  <Item>
    <Group>
      <Item>
        <Group/>
        ...
      </Item>
      <Item/>
    </Group>
    <Group>
    </Group>
  </Item>
</Tree>



Для обработки применяю такой XSLT:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<xsl:template match="Tree">
<ul>
<xsl:apply-templates select="DeviceItem"/>
</ul>
</div>
</xsl:template>

<xsl:template match="Item">
<li>
  <xsl:value-of select="."/>
  <ul>
    <xsl:apply-templates select="Group"/>
  </ul>
</li>
</xsl:template>

<xsl:template match="Group">
<li>
  <xsl:value-of select="."/>
  <ul>
    <xsl:apply-templates select="Item"/>
  </ul>
</li>
</xsl:template>



Почему-то первое время у меня выводился не иерархический список, а плоский (т.е. в запрос Item попадают ноды любой вложенности). Однако сейчас выводится нормально.
Это был глюк? Или я неправильно обрабатываю иерархию?

И второй вопрос, как проверить наличие потомков (чтобы не выводить пустой <ul>)?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
25.12.2011, 17:57
    #37592646
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
По второму вопросу нашел функцию count(), он неактуален.
...
Рейтинг: 0 / 0
25.12.2011, 18:45
    #37592660
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
Alibek B.который содержит коллекцию ItemAlibek B.
Код: xml
1.
<xsl:apply-templates select="DeviceItem"/>

не наталкивает ни на какие мысли?
Alibek B.как проверить наличие потомков
Код: xml
1.
2.
3.
<if test="*">
  ..............
</xsl:if>
...
Рейтинг: 0 / 0
25.12.2011, 19:08
    #37592665
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
1. Нет, это в процессе переноса на форум забыл заменить DeviceItem на Item.
2. test="*" ведь проверяет любых потомков? А если мне нужно учитывать только ноды с именем Item? Сейчас я использую count(Item)>0, стоит ли заменить на что-то более правильное?
...
Рейтинг: 0 / 0
25.12.2011, 19:36
    #37592676
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
Alibek B.нужно учитывать только ноды с именем Item
Код: xml
1.
2.
3.
<if test="Item">
  ..............
</xsl:if>
...
Рейтинг: 0 / 0
25.12.2011, 20:59
    #37592727
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
Еще один вопрос.
Имеется структура:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<Tree>
  <Item name="item1" state="1">
    <Group name="item1:1">
      <Item name="item2" state="0">
        <Group name="item2:1">
          <Item name="item3" state="0"/>
        </Group>
        <Group name="item2:2">
          <Item name="item4" state="0"/>
        </Group>
        <Group name="item2:3">
          <Item name="item5" state="1"/>
        </Group>
      </Item>
    </Group>
  </Item>
  <Item name="item6">
    <Group name="item6:1">
      <Item name="item7" state="0"/>
      <Item name="item8" state="0"/>
      <Item name="item9" state="0"/>
    </Group>
    <Group name="item6:2">
      <Item name="item10" state="0"/>
      <Item name="item11" state="0"/>
    </Group>
  </Item>
  <Item name="item12" state="0">
  </Item>
</Tree>


Из нее мне нужно получить такой список/коллекцию:
item2

item3

item4

item7,item8,item9

item10,item11

item12

Другими словами, нужно получить список узлов Item, у которых state=0; список должен быть сгруппирован по родителькому Group (т.е. узлы принадлежащие одному Group выводятся через запятую).

Теоретически, должен работать такой стиль:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<xsl:template match="Tree">
<ul>
<xsl:apply-templates select="Item[@state=0]"/>
</ul>
</div>
</xsl:template>

<xsl:template match="Item[@state=0]">
<xsl:value-of select="."/>,
<xsl:apply-templates select="Group"/>
</xsl:template>

<xsl:template match="Group">
<xsl:if test="Item[@state=0]"><li><xsl:apply-templates select="Item[@state=0]"/></li></xsl:if>
</xsl:template>



Однако не работает.
Не подскажите, где ошибка?
...
Рейтинг: 0 / 0
25.12.2011, 22:38
    #37592791
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Пара вопросов по иерархическим структурам
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
<xsl:template match="Tree">
  <div>
    <ul>
      <xsl:apply-templates select="*"/>
    </ul>
  </div>
</xsl:template>

<xsl:template match="Item" mode="group">
  <xsl:param name="items"/>
  <xsl:value-of select="@name"/>
  <xsl:if test="$items[last()] != .">,</xsl:if>
</xsl:template>

<xsl:template match="Item">
  <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="Group">
  <xsl:variable name="items" select="Item[@state=0]"/>
  <xsl:if test="$items">
    <li>
      <xsl:apply-templates select="$items" mode="group">
        <xsl:with-param name="items" select="$items"/>
      </xsl:apply-templates>
    </li>
  </xsl:if>
  <xsl:apply-templates select="*"/>
</xsl:template>

Как-то так.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Пара вопросов по иерархическим структурам / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]