Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL и lookup (key) во внешнем документе / 19 сообщений из 19, страница 1 из 1
17.01.2012, 11:03
    #37617569
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Есть у меня два XML-файла, data.xml и refs.xml. К ним есть XSL-файл.
Содержимое под спойлером.

data.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='style.xsl'?>
<Data>
	<Params clock="2011-12-25T01:07:23.000"/>
	<Result>
		<DeviceList>
			<DeviceQuery device="DEVICE1" state="disable"/>
			<DeviceQuery device="DEVICE2" state="skip"/>
			<DeviceQuery device="DEVICE3" state="warning"/>
			<DeviceQuery device="DEVICE4" state="ok"/>
			<DeviceQuery device="DEVICE5" state="ok"/>
			<DeviceQuery device="DEVICE6" state="ok"/>
			<DeviceQuery device="DEVICE7"/>
		</DeviceList>
	</Result>
</Data>



refs.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8"?>
<Data>
	<References>
		<States>
			<State level="0" class="skip"             code="disable" title="Проверка устройства отключена"/>
			<State level="1" class="skip"             code="check"   title="Устройство проверяется"/>
			<State level="2" class="ok"    mode="on"  code="ok"      title="Устройство работает нормально"/>
			<State level="3" class="ok"    mode="on"  code="info"    title="Устройство работает, есть дополнительная информация"/>
			<State level="4" class="ok"    mode="on"  code="notice"  title="Устройство работает, требуется проверка"/>
			<State level="5" class="error" mode="on"  code="warning" title="Есть проблемы, требуется их устранение"/>
			<State level="6" class="alarm" mode="off" code="alarm"   title="В работе устройства есть критические проблемы"/>
			<State level="7" class="alarm" mode="off" code="fail"    title="Не удалось проверить работу устройства"/>
			<State level="9" class="alarm" mode="off" code="skip"    title="Устройство недоступно"/>
		</States>
	</References>
</Data>



style.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.
<?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" select="document('refs.xml')"/>
<xsl:key name="state" match="/Data/References/States/State" use="@code"/>

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

<body>
<div>/Data/Params/@clock = <xsl:value-of select="/Data/Params/@clock"/></div>

<h1>DeviceList</h1>
<xsl:apply-templates select="/Data/Result/DeviceList"/>
<hr/>

<h1>Ref-State</h1>
<ul>
<xsl:for-each select="$ref/Data/References/States/State">
<li>state=<xsl:value-of select="@code"/></li>
</xsl:for-each>
</ul>
<hr/>

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


<xsl:template match="/Data/Result/DeviceList">
<h2>Список элементов:</h2>
<ul>
<xsl:for-each select="DeviceQuery">
<li>device=<xsl:value-of select="@device"/>, state=<xsl:value-of select="@state"/><br/>
state-title=<xsl:value-of select="key('state',@state)/@title"/>
</li>
</xsl:for-each>
</ul>
</xsl:template>

</xsl:stylesheet>




Мне нужно, используя key, обращаться к справочникам внешнего файла.
Как я понял из документации, в XSLT2 для этого у key есть третий аргумент, т.е. можно написать key('state',@state,$ref).
Однако когда я так пишу, получаю ошибку синтаксиса (недопустимое число аргументов key).
Если вначале файла стилей пишу xsl:stylesheet version="2.0" , то получаю рантаймовую ошибку; сгенерированная страница выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Список элементов:
  - device=DEVICE1, state=disable
    state-title=Не удается отобразить страницу XML 
Не удается просмотреть ввод XML с использованием списка стилей XSL. Исправьте ошибку и затем нажмите кнопку "Обновить"или повторите попытку позднее. 
--------------------------------------------------------------------------------
Недопустимое число аргументов. -->key('state',@state,$ref)<--/@title

Подскажите, как правильно указать, что используется XSLT2.
Или же как использовать внешние справочники с XSLT1.

Использование циклов (select="$ref/Data/References/States/State[@code=/Data/Result/DeviceList/DeviceQuery/@state]/@title") не подходит, справочники большие и страница генерируется долго, нужны именно key.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
17.01.2012, 11:14
    #37617582
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
При переключении контекста:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<h1>Ref-State</h1>
<ul>
<xsl:for-each select="$ref/Data/References/States/State">
<li>state=<xsl:value-of select="@code"/>, title=<xsl:value-of select="key('state',@code)/@title"/></li>
</xsl:for-each>
</ul>
<hr/>


key работает.
Но у меня как раз контекст переключать нельзя, у меня key используется внутри select-выражений из других узлов.
...
Рейтинг: 0 / 0
17.01.2012, 12:54
    #37617810
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Код: xml
1.
<xsl:key name="state" match="$ref/Data/References/States/State" use="@code"/>
...
Рейтинг: 0 / 0
17.01.2012, 12:57
    #37617820
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Это я пробовал первым делом, переменные в match не допускаются.
...
Рейтинг: 0 / 0
17.01.2012, 16:20
    #37618366
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Alibek B.контекст переключать нельзя, у меня key используется внутри select-выражений из других узлов.Используйте переменные
Код: xml
1.
2.
3.
4.
<xsl:variable name="state" select="$ref/Data/..../State[@code = current()/@code]"/>
<li>
  <xsl:value-of select="concat('state=', @code, ', title =', $state/@title)"/>
</li>
...
Рейтинг: 0 / 0
17.01.2012, 16:25
    #37618393
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Вообщем вопрос закрывается.
Перевел все на XSLT2, трансформацию произвожу внешним процессором (SaxonHE), браузерам подсовываю готовый HTML.

Единственный вопрос, если указываю метов вывода html, то элемент BR у меня трансформируется в <br></br>. Впрочем такое происходит со всеми тэгами, в том числе и непарными, но вот конкретно <br></br> в браузерах отображается как два перевода строки.
Подскажите, как это убрать?
Сейчас я просто произвожу массовую замену текста (заменяю "<br></br>" на "<br/>"). А можно ли сделать так, чтобы пустые тэги (или некоторые пустые тэги) выводились автономными, как это делается в случае типа вывода xml?
...
Рейтинг: 0 / 0
17.01.2012, 16:27
    #37618399
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
_Vasilisk_Используйте переменные
Мне нужен именно key.
С key страница формируется секунду, с циклами она формируется секунд 40.
...
Рейтинг: 0 / 0
17.01.2012, 16:31
    #37618424
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Чем XHTML не устраивает?
...
Рейтинг: 0 / 0
17.01.2012, 16:31
    #37618429
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Alibek B.С key страница формируется секунду, с циклами она формируется секунд 40.Какие циклы??? Вы код видели?
...
Рейтинг: 0 / 0
17.01.2012, 17:18
    #37618570
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
_Vasilisk_Чем XHTML не устраивает?
Всем устраивает. Но разве такой output-method существует?
Насколько я видел в описании, может быть только xml, html, text.

_Vasilisk_Какие циклы??? Вы код видели?
Тут циклов нет.
Но в случае с более сложными проверками статичными переменными не обойтись.
Например такой XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Data>
  <Refs>
    <Classes>
      <Class code="class1" ... />
      <Class code="class2" ... />
      <Class code="class3" ... />
    </Classes>
    <States>
      <State code="code1" class="class1" ... />
      <State code="code2" class="class1" ... />
      <State code="code3" class="class2" ... />
    </States>
    <Items>
      <Item code="item1" ... />
      <Item code="item2" ... />
      <Item code="item3" ... />
    </Items>
  </Refs>
  <QueryList>
    <Query item="item1" state="code1"/>
    <Query item="item2" state="code3"/>
  </QueryList>
</Data>


Мне нужно отобрать/посчитать строки /Data/QueryList/Query, у которых задан статус с классом class="1".

Если использовать key, то это можно сделать так:
//Query[key('state',@state)/@class='class1']

Если без key, тогда так:
//Query[@state = /Data/Refs/States/State[@class='class']]
(и это и будет цикл/перебор)

Как тут может помочь переменная, если узел /Refs будет вынесен во внешний файл?
...
Рейтинг: 0 / 0
17.01.2012, 17:42
    #37618634
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Alibek B.Насколько я видел в описании, может быть только xml, html, text.XHTML = XML
Alibek B.Если без key, тогда так:
//Query[@state = /Data/Refs/States/State[@class='class']]
(и это и будет цикл/перебор)Естественно. А если так
Код: xml
1.
2.
<xsl:variable name="nodes" select="/Data/Refs/States/State[@class='class'"/>
//Query[@state = $nodes]]

то не будет.

P.S. Вы гонитесь за скоростью, а сами используете оператор //
...
Рейтинг: 0 / 0
17.01.2012, 17:42
    #37618635
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Alibek B.Насколько я видел в описании, может быть только xml, html, text.XHTML = XML
Alibek B.Если без key, тогда так:
//Query[@state = /Data/Refs/States/State[@class='class']]
(и это и будет цикл/перебор)Естественно. А если так
Код: xml
1.
2.
<xsl:variable name="nodes" select="/Data/Refs/States/State[@class='class'"/>
//Query[@state = $nodes]]

то не будет.

P.S. Вы гонитесь за скоростью, а сами используете оператор //
...
Рейтинг: 0 / 0
17.01.2012, 18:13
    #37618724
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
_Vasilisk_XHTML = XML
Видимо нет, потому что три разных браузера при этом показывали пустую страницу.
Хотя при выполнении команды "Просмотр HTML-кода" содержимое было правильным.
...
Рейтинг: 0 / 0
17.01.2012, 18:15
    #37618734
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
_Vasilisk_P.S. Вы гонитесь за скоростью, а сами используете оператор //
Ну я ведь упросил код, чтобы он был компактным.
Query у моем случае иерархический, с произвольной глубиной вложения.

А вот то, что в переменной может быть набор узлов, а не скаляр, я не знал.
Подумаю, как можно переделать.
...
Рейтинг: 0 / 0
17.01.2012, 18:51
    #37618780
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Alibek B.Видимо нет, потому что три разных браузера при этом показывали пустую страницу.
Хотя при выполнении команды "Просмотр HTML-кода" содержимое было правильным.DOCTYPE правильный был указан?
Alibek B.Ну я ведь упросил код, чтобы он был компактным.Почувствуйте разницу между // и .//
...
Рейтинг: 0 / 0
17.01.2012, 20:42
    #37618901
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
_Vasilisk_DOCTYPE правильный был указан?
При выводе в HTML:
Код: plaintext
1.
2.
3.
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns=" http://www.w3.org/1999/xhtml"> 
При выводе в XML:
Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns=" http://www.w3.org/1999/xhtml"> 
...
Рейтинг: 0 / 0
17.01.2012, 20:48
    #37618907
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
А ContentType правильный идет?
...
Рейтинг: 0 / 0
17.01.2012, 20:51
    #37618912
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
...
Рейтинг: 0 / 0
17.01.2012, 21:02
    #37618924
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL и lookup (key) во внешнем документе
Нет, дело не в mime-типах.
Во-первых, у сформированного файла расширение html, поэтому он всегда отдается, как text/html. Только в тех случаях, когда это на самом деле xhtml, страница пустая.
Во-вторых, я сейчас переименовал файл в index.xhtml и попробовал открыть страницу через IE. Браузер предложил сохранить файл.
То есть хак по ссылке (замена Content-Type на text/html, когда браузер не поддерживает application/xhtml+xml) тут не причем.

Где-то я читал, что IE интерпретирует документ как строгий XHTML только тогда, когда во-первых doctype установлен соответствующий (XHTML 1.0 Strict), а во-вторых mime-тип правильный (application/xhtml+xml). Но если mime-тип неправильный (text/html), это сказывается на некоторых отступлениях при рендере страницы, но не на том, что страница не рендерится вообще.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL и lookup (key) во внешнем документе / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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