powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Использование внешних справочников, не выходит каменный цветок
5 сообщений из 5, страница 1 из 1
Использование внешних справочников, не выходит каменный цветок
    #37592528
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два xml-файла, refs.xml и data.xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Data>
  <States>
    <State code="ok" level="0" title="Normal"/>
    <State code="warn" level="1" title="Warning"/>
    <State code="err" level="2" title="Error"/>
    <State code="alarm" level="3" title="Alarm"/>
  </States>
  <Items>
    <Item code="i1" title="Item 1"/>
    <Item code="i2" title="Item 2"/>
    <Item code="i3" title="Item 3"/>
  </Items>
</Data>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Data>
  <Param clock="2011-01-01T00:00:00"/>
  <Items>
    <Item code="i1" state="ok"/>
    <Item code="i2" state="ok"/>
    <Item code="i3" state="err"/>
  </Items>
  <Logs>
    <Log clock="2011-01-01T00:00:00" item="i1" message="Query ok"/>
    <Log clock="2011-01-01T00:01:00" item="i2" message="Query ok"/>
    <Log clock="2011-01-01T00:02:00" item="i3" message="Query failed">Error 10, no access.</Log>
    <Log clock="2011-01-01T00:03:00" item="i1" message="Query ok"/>
</Data>



Мне нужно получить из файла data.xml примерно такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
====================
States:
  ok    - Normal
  warn  - Warning
  err   - Error
  alarm - Alarm
--------------------

====================
Errors (state level > 1):
  - Item 3
--------------------

====================
System log:
Time   Device  Result
00:00  Item 1  Query ok
00:01  Item 2  Query ok
00:02  Item 3  Query failed - Error 10, no access.
00:03  Item 1  Query ok
--------------------

Использую примерно такой 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.
67.
68.
69.
70.
71.
<?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:variable name="ref-item" select="document('refs.xml')/Items/Item"/>
<xsl:variable name="ref-state" select="document('refs.xml')/States/State"/>

<xsl:key name="item" match="Item" use="@code"/>
<xsl:key name="state" match="State" use="@code"/>

<xsl:template match="/">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head><title>Title</title></head>
  <body">
  <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="/Data/Param">
  Clock: <xsl:value-of select="@title"/>

  <h1>States</h1>
  <ul>
  <xsl:apply-templates select="$ref-state">
    <xsl:with-param name="ptr-state" select="@code"/>
  </xsl:apply-templates>
  </ul>
</xsl:template>

<xsl:template match="/Data/States/State">
  <xsl:param name="ptr-code"/>
  <xsl:for-each select="key('state',$ptr-code)">
    <li>
      <xsl:value-of select="$ptr-code"/> - <xsl:value-of select="$ref-state/@title"/>
    </li>
  </xsl:for-each>
</xsl:template>

<xsl:template match="Items">
  <h1>Errors</h1>
  <ul>
    <xsl:for-each select="Item[key('state',@state)/@level>1]">
      <li>
        <xsl:value-of select="@title"/>
      </li>
    </xsl:for-each>
  </ul>
</xsl:template>

<xsl:template match="Logs">
  <h1>Log</h1>
  <table>
    <tr>
      <th>Time</th>
      <th>Device</th>
      <th>Result</th>
    </tr>
  <xsl:apply-templates/>
  </table>
</xsl:template>

<xsl:template match="Log">
    <tr>
      <td><xsl:value-of select="@clock"/></td>
      <td><xsl:value-of select="key('item',@item)/@title"/></td>
      <td><xsl:value-of select="@message"/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>




В XSL могут быть мелкие ошибки в процессе копипаста, но основная структура (т.е. data.xml, без использования refs.xml) работает, лист формируется правильно.
Начались проблемы после того, как попробовал к листу прикрутить внешний справочник.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Использование внешних справочников, не выходит каменный цветок
    #37592615
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой процессор используете? Функция document() в нем разрешена?
...
Рейтинг: 0 / 0
Использование внешних справочников, не выходит каменный цветок
    #37592621
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, видимо стандартный.
Открываю xml-документ в IE и Opera. Также тестирую из Visual Studio 2005.

Пока решил вопрос тем, что скопировал узлы из справочника в основной документ и делаю XSL таким способом; так key работает.
Когда завершу с версткой, попробую вынести справочники в отдельный файл.
...
Рейтинг: 0 / 0
Использование внешних справочников, не выходит каменный цветок
    #37592659
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Не знаю, видимо стандартный.
Открываю xml-документ в IE и Opera. Также тестирую из Visual Studio 2005.Уже смешно. IE использует MSXML, студия - System.Xml, а опера свои разработки. И, что такое "стандартный" тогда?

Ну и, как минимум, должно быть
Код: xml
1.
2.
<xsl:variable name="ref-item" select="document('refs.xml')/Data/Items/Item"/>
<xsl:variable name="ref-state" select="document('refs.xml')/Data/States/State"/>
...
Рейтинг: 0 / 0
Использование внешних справочников, не выходит каменный цветок
    #37605050
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобраться самому не получилось.
Указание /Data после document() (который я забыл в исходном посте) не работает.

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


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