Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Использование внешних справочников, не выходит каменный цветок / 5 сообщений из 5, страница 1 из 1
25.12.2011, 14:16
    #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
25.12.2011, 16:48
    #37592615
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование внешних справочников, не выходит каменный цветок
Какой процессор используете? Функция document() в нем разрешена?
...
Рейтинг: 0 / 0
25.12.2011, 17:08
    #37592621
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование внешних справочников, не выходит каменный цветок
Не знаю, видимо стандартный.
Открываю xml-документ в IE и Opera. Также тестирую из Visual Studio 2005.

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


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