Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите разобраться с составным ключом / 3 сообщений из 3, страница 1 из 1
13.10.2013, 00:08
    #38425406
Qfab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с составным ключом
Имеется вот такой вот файл 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.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="lab.xsl"?>
<lab>
	<course id="XML">
		<title>XML и XSLT. Современные технологии обработки данных для Web</title>
		<keywords>
			<keyword>XML</keyword>
			<keyword>XML Schema</keyword>
			<keyword>XPath</keyword>
			<keyword>XSLT</keyword>
		</keywords>
		<teachers>
			<teacher>Никитин И.Г.</teacher>
			<teacher>Павлов Ю.Е.</teacher>
		</teachers>
	</course>
	<course id="AJAX">
		<title>AJAX. Разработка web-приложений для Web 2.0</title>
		<keywords>
			<keyword>AJAX</keyword>
			<keyword>XML</keyword>
			<keyword>XML Schema</keyword>
			<keyword>JavaScript</keyword>
			<keyword>XSLT</keyword>
		</keywords>
		<teachers>
			<teacher>Никитин И.Г.</teacher>
			<teacher>Чебыкин Р.И.</teacher>
		</teachers>
	</course>
	<course id="PHP">
		<title>Профессиональное программирование на PHP 5</title>
		<keywords>
			<keyword>PHP</keyword>
			<keyword>XML</keyword>
			<keyword>XSLT</keyword>
		</keywords>
		<teachers>
			<teacher>Никитин И.Г.</teacher>
			<teacher>Борисов И.О.</teacher>
		</teachers>
	</course>
</lab>


А вот соответствующая таблица преобразования lab.xsl:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" encoding="UTF-8" />
	<xsl:key name="ixCourseTeacherKeyword" match="/lab/course/teachers/teacher" use="concat(., '-', ../../keywords/keyword)" />
 	<xsl:template match="/">
		<html>
			<head>
				<title>lab</title>
			</head>
			<body>
				<p>Курсы, которые читает преподаватель Борисов И.О., и в которых есть тема XSLT: <xsl:apply-templates select="key('ixCourseTeacherKeyword', 'Борисов И.О.-XSLT')" /></p>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="teacher">
		<xsl:value-of select="../../@id" />
		<xsl:if test="position() < last()">
			<xsl:text>, </xsl:text>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>


Логично, что на выходе должно быть получено - PHP . Но в том то и проблема, что данный результат не получается. Перепробовав разные варианты, я пришёл к выводу (если не прав - поправьте) - вся соль в функции concat, а именно в выражении получения доступа к вложенному узлу ../../ keywords/keyword . Если подставить ../../ title , то всё работает хорошо.
Первоначальный вид ключа был
Код: xml
1.
<xsl:key name="ixCourseTeacherKeyword" match="/lab/course" use="concat(teachers/teacher, '-', keywords/keyword)" />


что более понятно, но он работает лишь при условии что указаны только первые вложенные узлы ( Никитин И.Г. - XML или Никитин И.Г. - AJAX или Никитин И.Г. - PHP ):
Код: xml
1.
<xsl:apply-templates select="key('ixCourseTeacherKeyword', 'Никитин И.Г.-PHP')" />


Нигде подобной ситуации не встречал - ни в книгах, ни в сети - а очень хочется разобраться, что к чему (ведь по идее не должно было быть никаких сложностей). Помогите разобраться в данной ситуации.
...
Рейтинг: 0 / 0
13.10.2013, 01:41
    #38425453
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с составным ключом
Qfab,

вариант:
Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="UTF-8"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>lab</title>
      </head>
      <body>
        <p>
          Курсы, которые читает преподаватель Борисов И.О., и в которых есть тема XSLT:
          <xsl:apply-templates select="//course[teachers/teacher='Борисов И.О.' and keywords/keyword='XSLT']"/>
        </p>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="course">
    <p>
      <xsl:value-of select="./title"/>
    </p>
  </xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
14.10.2013, 00:49
    #38425994
Qfab
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с составным ключом
За такое решение спасибо, но нужен именно вариант с составным ключом, ибо в нём вся соль. Т.е. в данной ситуации получить желаемый результат возможно различными способами (xml позволяет), но как его получить, применяя именно составной ключ - для меня пока загадка. Возможно, кто-то уже сталкивался с таким и знает решение.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите разобраться с составным ключом / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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