powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Пара вопросов по иерархическим структурам
7 сообщений из 7, страница 1 из 1
XSLT: Пара вопросов по иерархическим структурам
    #37592629
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 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
XSLT: Пара вопросов по иерархическим структурам
    #37592646
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По второму вопросу нашел функцию count(), он неактуален.
...
Рейтинг: 0 / 0
XSLT: Пара вопросов по иерархическим структурам
    #37592660
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.который содержит коллекцию ItemAlibek B.
Код: xml
1.
<xsl:apply-templates select="DeviceItem"/>

не наталкивает ни на какие мысли?
Alibek B.как проверить наличие потомков
Код: xml
1.
2.
3.
<if test="*">
  ..............
</xsl:if>
...
Рейтинг: 0 / 0
XSLT: Пара вопросов по иерархическим структурам
    #37592665
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Нет, это в процессе переноса на форум забыл заменить DeviceItem на Item.
2. test="*" ведь проверяет любых потомков? А если мне нужно учитывать только ноды с именем Item? Сейчас я использую count(Item)>0, стоит ли заменить на что-то более правильное?
...
Рейтинг: 0 / 0
XSLT: Пара вопросов по иерархическим структурам
    #37592676
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.нужно учитывать только ноды с именем Item
Код: xml
1.
2.
3.
<if test="Item">
  ..............
</xsl:if>
...
Рейтинг: 0 / 0
XSLT: Пара вопросов по иерархическим структурам
    #37592727
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вопрос.
Имеется структура:
Код: 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
XSLT: Пара вопросов по иерархическим структурам
    #37592791
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
7 сообщений из 7, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Пара вопросов по иерархическим структурам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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