powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL и lookup (key) во внешнем документе
19 сообщений из 19, страница 1 из 1
XSL и lookup (key) во внешнем документе
    #37617569
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня два 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
XSL и lookup (key) во внешнем документе
    #37617582
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При переключении контекста:
Код: 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
XSL и lookup (key) во внешнем документе
    #37617810
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
<xsl:key name="state" match="$ref/Data/References/States/State" use="@code"/>
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37617820
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я пробовал первым делом, переменные в match не допускаются.
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618366
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XSL и lookup (key) во внешнем документе
    #37618393
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем вопрос закрывается.
Перевел все на XSLT2, трансформацию произвожу внешним процессором (SaxonHE), браузерам подсовываю готовый HTML.

Единственный вопрос, если указываю метов вывода html, то элемент BR у меня трансформируется в <br></br>. Впрочем такое происходит со всеми тэгами, в том числе и непарными, но вот конкретно <br></br> в браузерах отображается как два перевода строки.
Подскажите, как это убрать?
Сейчас я просто произвожу массовую замену текста (заменяю "<br></br>" на "<br/>"). А можно ли сделать так, чтобы пустые тэги (или некоторые пустые тэги) выводились автономными, как это делается в случае типа вывода xml?
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618399
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Используйте переменные
Мне нужен именно key.
С key страница формируется секунду, с циклами она формируется секунд 40.
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618424
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем XHTML не устраивает?
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618429
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.С key страница формируется секунду, с циклами она формируется секунд 40.Какие циклы??? Вы код видели?
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618570
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
XSL и lookup (key) во внешнем документе
    #37618634
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XSL и lookup (key) во внешнем документе
    #37618635
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XSL и lookup (key) во внешнем документе
    #37618724
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_XHTML = XML
Видимо нет, потому что три разных браузера при этом показывали пустую страницу.
Хотя при выполнении команды "Просмотр HTML-кода" содержимое было правильным.
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618734
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_P.S. Вы гонитесь за скоростью, а сами используете оператор //
Ну я ведь упросил код, чтобы он был компактным.
Query у моем случае иерархический, с произвольной глубиной вложения.

А вот то, что в переменной может быть набор узлов, а не скаляр, я не знал.
Подумаю, как можно переделать.
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618780
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Видимо нет, потому что три разных браузера при этом показывали пустую страницу.
Хотя при выполнении команды "Просмотр HTML-кода" содержимое было правильным.DOCTYPE правильный был указан?
Alibek B.Ну я ведь упросил код, чтобы он был компактным.Почувствуйте разницу между // и .//
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618901
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
XSL и lookup (key) во внешнем документе
    #37618907
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ContentType правильный идет?
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618912
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
XSL и lookup (key) во внешнем документе
    #37618924
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, дело не в 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
19 сообщений из 19, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL и lookup (key) во внешнем документе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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