Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xslt key с составным ключом / 3 сообщений из 3, страница 1 из 1
13.12.2014, 17:21
    #38833170
мимо xml
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt key с составным ключом
Исходный xml:
Код: sql
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.
<?xml version="1.0" encoding="UTF-8"?>
<lab6_1>
    <course id="XML">
        <title>
            XML и XSLT. Современные технологии
            обработки данных для Web и Office 2007
        </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>
</lab6_1>



XSLT
Код: sql
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.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <!--
    <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-transitional.dtd"        
        encoding="UTF-8"
        byte-order-mark="yes"
    />
    -->

    <!--
    <xsl:output 
        method="html" 
        indent="yes"
        encoding="UTF-8"
        doctype-public="-//W3C//DTD HTML 4.01//EN"
        doctype-system="http://www.w3.org/TR/html4/strict.dtd"
        byte-order-mark="yes"
    />
    -->
    
    <xsl:output 
        method="xml" 
        indent="yes"
        encoding="UTF-8"
        byte-order-mark="yes"
    />
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="courseByPrepod" match="/lab6_1/course" use="teachers/teacher"/>
    <xsl:key name="courseByKeyword" match="/lab6_1/course" use="keywords/keyword"/>
    <xsl:key name="courseByPrepodAndKeyword" match="/lab6_1/course" use="concat(teachers/teacher, ':', keywords/keyword)"/>
    
    <xsl:template match="/">
        <course_group name="Курсы, которые читает Чебыкин Р.И.:">
            <xsl:apply-templates select="key('courseByPrepod', 'Чебыкин Р.И.')">
                <xsl:sort select="title"/>
            </xsl:apply-templates>
        </course_group>        
        <course_group name="Курсыпо XML:">
            <xsl:apply-templates select="key('courseByKeyword', 'XML')">
                <xsl:sort select="title"/>
            </xsl:apply-templates>
        </course_group>        
        <course_group name="Курсы Борисов и XSLT:">
            <xsl:apply-templates select="key('courseByPrepodAndKeyword', concat('Борисов И.О.', ':', 'XSLT'))">
                <xsl:sort select="title"/>
            </xsl:apply-templates>
        </course_group>        
    </xsl:template>
    
    <xsl:template match="course">
        <xsl:copy-of select="."/>
    </xsl:template>
        
</xsl:stylesheet>



Вывод:
Код: sql
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.
&#65279;<?xml version="1.0" encoding="UTF-8"?>
<course_group name="Курсы, которые читает Чебыкин Р.И.:">Никитин И.Г.:AJAX<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_group>
<course_group name="Курсыпо XML:">Никитин И.Г.:XML<course id="XML">
      <title>
            XML и XSLT. Современные технологии
            обработки данных для Web и Office 2007
        </title>
      <keywords>
         <keyword>XML</keyword>
         <keyword>XML Schema</keyword>
         <keyword>XPath</keyword>
         <keyword>XSLT</keyword>
      </keywords>
      <teachers>
         <teacher>Никитин И.Г.</teacher>
         <teacher>Павлов Ю.Е.</teacher>
      </teachers>
   </course>Никитин И.Г.:AJAX<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>Никитин И.Г.:PHP<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>
</course_group>
<course_group name="Курсы Борисов и XSLT:"/>



Соответствующий узел в выводе пустой. ВИдимо потому что concat, если ей передавать на вход присоздании ключа две последовательности строк - возьмет тупо по одному элементу из каждой последовательности. Как бы сделать всеже при такой структуре xml индекс с составным ключем?
...
Рейтинг: 0 / 0
15.12.2014, 14:25
    #38834139
PA
PA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt key с составным ключом
мимо xml,

т.н. Kaysian method - позволяет получить пересечение двух множеств:

Код: xml
1.
2.
3.
4.
<xsl:variable name="v1" select="key('courseByPrepod', 'Борисов И.О.')"/>
<xsl:variable name="v2" select="key('courseByKeyword', 'XSLT')"/>
...
<xsl:apply-templates select="$v1[count($v2)=count(.|$v2)]">
...
Рейтинг: 0 / 0
16.12.2014, 09:59
    #38834748
мимо xml
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt key с составным ключом
PA,

круто, спасибо. книгу его почитаю также!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xslt key с составным ключом / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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