powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Запрос, использующий для проверки атрибуты из другой ноды
10 сообщений из 10, страница 1 из 1
Запрос, использующий для проверки атрибуты из другой ноды
    #37593833
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой XML (States — справочник состояний, Result — результаты):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Data>
  <States>
    <State code="skip" level="0"/>
    <State code="ok" level="0"/>
    <State code="info" level="1"/>
    <State code="notice" level="2"/>
    <State code="warning" mode="on" level="3"/>
    <State code="error" mode="on" level="4"/>
    <State code="alarm" mode="off" level="5"/>
    <State code="fail" mode="off" level="6"/>
  </States>
  <Results>
    <Result item="i1" state="ok"/>
    <Result item="i2" state="warning"/>
    <Result item="i3" state="info"/>
    ...
    <Result item="i999" state="alarm"/>
  </Results>
</Data>



Мне нужно вычислить следующие значения:
1. Количество результатов — count(//Result)
2. Количество результатов, у которых @state=skip — count(//Result[@state='skip'])
3. Количество результатов, у которых @state!=skip и State/@level<3 — ???
4. Количество результатов, у которых State/@level>=3 и State/@mode=on — ???
5. Количество результатов, у которых State/@level>=3 и State/@mode=on — ???

Не знаю, как сделать пункты 4 и 5. Как сделать пункт 3 тоже не знаю, но там можно сделать по другому, count(//Result[@state='ok' or @state='info' or @state='notice']).

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37593847
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить в терминах реляционных БД, то мне нужен join. Или хотя бы in.
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37593863
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, разобрался.
Что-то вроде count(//Result[@state=//State[@level<2]/@code]).
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37594486
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова вопрос возник, самому составить запрос не получается.
Есть нода Root. В ней есть коллекция Item. Item может содержать коллекцию Group. Group может содержать коллекцию Item. Глубина вложений может быть произвольная. У Item есть атрибуты @name и @state.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Tree>
  <Item name="..." state="on">
    <Group>
      <Item name="..." state="on">
        <Group/>
        ...
      </Item>
      <Item name="..." state="on"/>
    </Group>
    <Group>
    </Group>
  </Item>
</Tree>



Мне нужно из этой структуры получить три параметра.
1. Количество Item, у которых есть подчиненные Item.
2. Количество Item, у которых нет подчиненных Item (вариант — количество Item, у которых нет потомков, в том числе и Group).
3. Суммарное количество Group, у которых есть подчиненные Item с @state=on (варианты — все подчиненные Item содержат @state=on; хотя бы один из подчиненных Item содержит @state=on).

Первые два параметра я получил как count(//Item[*]) и count(//Item[not(*)]), но возможно это неправильный или не самый лучший способ.
Как получить третий параметр я пока себе не представляю. Видимо что-то типа count(//Group[/Item[@state='on']), но на этом у меня фантазия заканчивается.
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37594633
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

count( //Item[ descendant::Item ])
count( //Item[ not( descendant::Item )])
count( //Group[ descendant::Item[ @state = 'on' ]])
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37594642
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
<xsl:variable name="states" select="/Data/States/State" />
<xsl:variable name="results" select="/Data/Results/Result" />


count( $results )
count( $results[ @state = 'skip' ])
count( $results[ not( @state = 'skip' ) and @state = $states[ @level &lt; 3 ]/@code ])
count( $results[ @state = $states[ @level &lt; 3 and @code != 'skip' ]/@code ])
count( $results[ @state = $states[ @level &gt;= 3 and @mode = 'on' ]/@code ])
count( $results[ @state = $states[ @level &gt;= 3 and @mode = 'off' ]/@code ])
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37594698
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю, буду разбираться.
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37604930
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобраться самому не получилось.
Сейчас у меня используется один файл, data.xml.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/Data
  /Params
  /References
    /States
      /State[]
    /Devices
      /Device[]
    ...
  /Result
    /DeviceList
      /DeviceQuery[]
    /ResultValues
      /ResultValue[]
  /Logs
    /Log[]
Я хочу узел /Data/References перенести в отдельный файл, refs.xml, чтобы получилось следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
refs.xml
/Data
  /References
    /States
      /State[]
    /Devices
      /Device[]
    ...

data.xml
/Data
  /Params
  /Result
    /DeviceList
      /DeviceQuery[]
    /ResultValues
      /ResultValue[]
  /Logs
    /Log[]

XSL слишком большой, чтобы весь его размещать тут, но основная структура у него такая:
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

<xsl:key name="device" match="/Data/References/Devices/Device" use="@name"/>
<xsl:key name="state"  match="/Data/References/States/State" use="@code"/>
<xsl:key name="query"  match="/Data/Result/DeviceList/DeviceQuery" use="@device"/>
<xsl:key name="value"  match="/Data/Result/ResultValues/ResultValue" use="@field"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>...</title>
</head>

<body>
<h1>Title</h1>
<div id="timestamp">Обновлено:<br/><xsl:value-of select="/Data/Params/@clock"/></div>

<div id="legend">
<xsl:apply-templates select="/Data/References/States"/>
</div>

<div id="main">
<xsl:apply-templates select="/Data/References/DeviceTree"/>
</div>

<div id="res">
...
<xsl:apply-templates select="/Data/References/Columns"/>
...
<xsl:apply-templates select="/Data/References/Charts"/>
...
<xsl:if test="count(//DeviceQuery[not(key('device',@device)/@type) and @state=//State[@class='alarm']/@code])>0">
<div id="fails">
<ul>
<xsl:for-each select="/Data/Result/DeviceList/DeviceQuery[not(key('device',@device)/@type) and key('state',@state)/@class='alarm']"><li><xsl:value-of select="@device"/> <a class="csv"><xsl:attribute name="href">getcsv.pl?phones&amp;scope=<xsl:value-of select="@device"/></xsl:attribute><img src="csv.png"/></a></li></xsl:for-each>
</ul>
</div>

<div id="log">
<xsl:apply-templates select="/Data/Logs"/>
</div>

</body>
</html>
</xsl:template>

...
<!-- States reference -->
<xsl:template match="/Data/References/States">
<ul>
<xsl:apply-templates select="./State"/>
</ul>
</xsl:template>

<!-- States reference -->
<xsl:template match="/Data/References/States/State">
<li>
	<div><xsl:attribute name="class">block state-<xsl:value-of select="@code"/></xsl:attribute>статус <xsl:value-of select="@level"/></div>
	<xsl:value-of select="@title"/>
</li>
</xsl:template>
...
</xsl:stylesheet>



Подскажите, какие изменения нужно сделать, чтобы XSL использовал два разных файла?
У меня из узла /Data/References используются lookup-таблицы с помощью key. Также в одном месте я вызываю шаблон для /Data/References/States.
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37605004
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Подскажите, какие изменения нужно сделать, чтобы XSL использовал два разных файла? Было же :)
...
Рейтинг: 0 / 0
Запрос, использующий для проверки атрибуты из другой ноды
    #37605047
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я ошибся; я в ту тему планировал написать.
Не получилось таким способом.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Запрос, использующий для проверки атрибуты из другой ноды
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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