Форум программистов, компьютерный форум, киберфорум
XML/XSL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
93 / 93 / 9
Регистрация: 20.02.2011
Сообщений: 210
1

Написание преобразования

02.12.2015, 16:12. Показов 569. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть входящий xml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<ed>
<v_a attr1="1" attr2="2"></v_a>
<v_b attr3="3" attr4="4"></v_b>
<v_c attr5="5" attr6="6">
<v_d attr7="7" attr8="8"></v_d>
</v_c>
<v_c attr5="9" attr6="10">
<v_d attr7="11" attr8="12"></v_d>
</v_c>
<v_c attr5="13" attr6="14">
<v_d attr7="15" attr8="16"></v_d>
</v_c>
</ed>
Требуется создать исходящий 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
<ed>
<common>
<attr1>1</attr1>
<attr2></attr2>
<attr3>3</attr3>
<attr4>4</attr4>
</common>
<detail>
<v_c>
<attr5>5</attr5>
<attr6>6</attr6>
<attr7>7</attr7>
<attr8>8</attr8>
</v_c>
<v_c>
<attr5>9</attr5>
<attr6>10</attr6>
<attr7>11</attr7>
<attr8>12</attr8>
</v_c>
<v_c>
<attr5>13</attr5>
<attr6>14</attr6>
<attr7>15</attr7>
<attr8>16</attr8>
</v_c>
</detail>
</ed>
Для common задачу вроде как решил, а вот для v_c не получается, код ниже:
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
<?xml version="1.0" encoding="WINDOWS-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <ed>
            <xsl:apply-templates select="*"/>
            <xsl:apply-templates select="v_c"/>
        </ed>
    </xsl:template>
 
    <xsl:template match="*">
        <xsl:if test="name()='ed' or name()='v_a' or name()='v_b'">
        <common>
            <xsl:for-each select="@*">
                <xsl:element name="{local-name()}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
            <xsl:apply-templates/>
        </common>
        </xsl:if>
    </xsl:template>
 
    <xsl:template match="v_c">
        <v_c>
            <xsl:for-each select="@*">
                <xsl:copy/>
            </xsl:for-each>
        </v_c>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>
Подскажите, чего не так
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2015, 16:12
Ответы с готовыми решениями:

Написание S-функции преобразования сигнала
Добрый день, уважаемые форумчане) Подскажите пожалуйста как написать S-функцию на m-языке, которая...

Посоветуйте литературу по написание основам написание плагинов
пишу курсовую на тему, основы написание плагинов. Посоветуйте литературу.

преобразования в Си...
Помогите разработать программу преобразования целых десятичных чисел с разрядностью до 7 цифр в...

Преобразования
Здравствуйте, как преобразовать Четырехугольник в пятиугольник или к примеру треугольник?

7
203 / 184 / 42
Регистрация: 23.10.2015
Сообщений: 778
02.12.2015, 23:11 2
djdish, Так должно быть? Или я что то упустил из виду?
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
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <ed>
            <common>
                <xsl:apply-templates select="//v_a | //v_b"/>
            </common>
            <detail>
                <xsl:apply-templates select="//v_c"/>
            </detail>
        </ed>
    </xsl:template>
 
    <xsl:template match="//v_a | //v_b">
        <xsl:for-each select="@*">
            <xsl:element name="{local-name()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
 
    <xsl:template match="//v_c">
        <v_c>
            <xsl:for-each select="@* | v_d/@*">
                <xsl:element name="{local-name()}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
        </v_c>
    </xsl:template>
</xsl:stylesheet>
Добавлено через 1 час 58 минут
или так еще можно.
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
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <ed>
            <common>
                <xsl:apply-templates select="//v_a/@* | //v_b/@*"/>
            </common>
            <detail>
                <xsl:apply-templates select="//v_c"/>
            </detail>
        </ed>
    </xsl:template>
 
    <xsl:template match="//v_a/@* | //v_b/@*">
            <xsl:element name="{local-name()}">
                <xsl:value-of select="."/>
            </xsl:element>
    </xsl:template>
 
    <xsl:template match="//v_c">
        <xsl:element name="{local-name()}">
            <xsl:for-each select="@* | v_d/@*">
                <xsl:element name="{local-name()}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
Добавлено через 1 час 10 минут
хотя мне нравится больше так
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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <ed>
            <common>
                <xsl:apply-templates select="//v_a/@* | //v_b/@*"/>
            </common>
            <detail>
                <xsl:apply-templates select="//v_c"/>
            </detail>
        </ed>
    </xsl:template>
 
    <xsl:template match="v_c">
        <xsl:element name="{local-name()}">
              <xsl:apply-templates select="./@* | v_d/@*" />
        </xsl:element>
    </xsl:template>
 
    <xsl:template match="@*">
        <xsl:element name="{local-name()}">
               <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
1
93 / 93 / 9
Регистрация: 20.02.2011
Сообщений: 210
03.12.2015, 08:54  [ТС] 3
Забыл уточнить, что в рутовом элементе ed указано пространство имён:
XML
1
<ed xmlns="urn:a:ed:v2.0">
Когда я его удаляю, то все указанные вами примеры работают, когда не удаляю ничего не преобразовывается.
Подскажите как с этим бороться
0
203 / 184 / 42
Регистрация: 23.10.2015
Сообщений: 778
03.12.2015, 17:14 4
djdish, вот как то так и можно....
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:v="urn:a:ed:v2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <ed>
            <common>
                <xsl:apply-templates select="//v:v_a/@* | //v:v_b/@*"/>
            </common>
            <detail>
                <xsl:apply-templates select="//v:v_c"/>
            </detail>
        </ed>
    </xsl:template>
 
    <xsl:template match="v:v_c">
        <xsl:element name="{local-name()}">
              <xsl:apply-templates select="./@* | v:v_d/@*" />
        </xsl:element>
    </xsl:template>
 
    <xsl:template match="@*">
        <xsl:element name="{local-name()}">
               <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
1
93 / 93 / 9
Регистрация: 20.02.2011
Сообщений: 210
04.12.2015, 10:04  [ТС] 5
Спасибо. Тему можно закрывать
0
93 / 93 / 9
Регистрация: 20.02.2011
Сообщений: 210
10.12.2015, 20:38  [ТС] 6
Раз уж не закрыли тему, появилась такая задача:
Есть XML:
XML
1
2
3
4
5
6
7
8
<info>
<book>Книга1</book>
<author>Автор1</author>
<book>Книга2</book>
<author>Автор2</author>
<book>Книга3</book>
<author>Автор3</author>
</info>
надо получить на выходе такой XML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<info>
<bookauthor>
<book>Книга1</book>
<author>Автор1</author>
</bookauthor>
<bookauthor>
<book>Книга1</book>
<author>Автор1</author>
</bookauthor>
<bookauthor>
<book>Книга1</book>
<author>Автор1</author>
</bookauthor>
</info>
Благодарю заранее!
0
203 / 184 / 42
Регистрация: 23.10.2015
Сообщений: 778
11.12.2015, 08:01 7
djdish,
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
      <info>
          <xsl:apply-templates select="info/book" />
      </info>
</xsl:template>
<xsl:template match="book">
      <bookauthor>
                <xsl:copy-of select="." />
            <author>
                <xsl:value-of select="following-sibling::author" />
            </author>
      </bookauthor>
</xsl:template>
</xsl:stylesheet>
Добавлено через 28 минут
или так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
      <info>
          <xsl:apply-templates select="info/book" />
      </info>
</xsl:template>
<xsl:template match="book">
      <bookauthor>
                <xsl:copy-of select="." />
                <xsl:apply-templates select="following-sibling::*[1]"/>
      </bookauthor>
</xsl:template>
<xsl:template match="author">
                <xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
1
93 / 93 / 9
Регистрация: 20.02.2011
Сообщений: 210
11.12.2015, 13:47  [ТС] 8
Если xml:
XML
1
2
3
4
5
6
7
<info>
<book>Книга1</book>
<author>Автор1</author>
<book>Книга2</book>
<book>Книга3</book>
<author>Автор3</author>
</info>
то книга2 не оборачивается в <bookauthor>

Добавлено через 1 час 4 минуты
Спасибо разобрался:
XML
1
<xsl:apply-templates select="following-sibling::*[1][name()!='book']"/>
0
11.12.2015, 13:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2015, 13:47
Помогаю со студенческими работами здесь

3D преобразования
добрый день. ЗАДАНИЕ 2. Трехмерные преобразования Составить программу, реализующую трехмерное...

Преобразования на плоскости
Помогите пожалуйста. Реализовать с заданной совокупностью фигур все виды афинных преобразований: ...

Перегрузка преобразования
Имеется Класс Const, в котором хранятся регулярное выражение класса Regex и текст типа string....

Конструктор преобразования
Пишу класс рациональных чисел: class rational { public: long long numerator, denominator;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru