Форум программистов, компьютерный форум, киберфорум
XML/XSL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 40
1

Два примера на XSLT. Один работает, другой нет. Почему?

02.01.2017, 08:33. Показов 660. Ответов 1
Метки нет (Все метки)

Есть у меня 2 похожих примера. Но один работает, а другой нет. Объясните почему. Как сделать, чтобы заработал второй пример?

Пример 1
Исходный документ:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<constants>
    <constant>
        <name>Гравитационная постоянная</name>
        <value item="м^3/(кг*с^2)">6.67E-11</value>
    </constant>
    <constant>
        <name>Молярная масса сухого воздуха, кг/моль</name>
        <value item="кг/моль">2.9E-2</value>
    </constant>
    <constant>
        <name>Универсальная газовая постоянная</name>
        <value item="Дж/(моль*К)">8.32</value>
    </constant>
</constants>
Необходимо получить:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<reference>
    <records>
        <record>
            <field id="name">Гравитационная постоянная</field>
            <field id="value">6.67E-11</field>
            <field id="item">м^3/(кг*с^2)</field>
        </record>
        <record>
            <field id="name">Молярная масса сухого воздуха, кг/моль</field>
            <field id="value">2.9E-2</field>
            <field id="item">кг/моль</field>
        </record>
        <record>
            <field id="name">Универсальная газовая постоянная</field>
            <field id="value">8.32</field>
            <field id="item">Дж/(моль*К)</field>
        </record>
    </records>
</reference>
Пишу такой XSLT:
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
<?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" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="/">
        <reference>
            <records>
                <xsl:apply-templates select="/constants/constant"/>
            </records>
        </reference>
    </xsl:template>
    
    <xsl:template match="constant">
        <record>
            <field id="name">
                <xsl:value-of select="./name"/>
            </field>
            <field id="value">
                <xsl:value-of select="./value"/>
            </field>
            <field id="item">
                <xsl:value-of select="./value/@item"/>
            </field>
        </record>
    </xsl:template>
    
</xsl:stylesheet>
и всё работает!

Пример 2

Исходный 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
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="SAS.Planet 16.06.06.9420" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 [url]http://www.topografix.com/GPX/1/1/gpx.xsd[/url] [url]http://www.garmin.com/xmlschemas/WaypointExtension/v1[/url] [url]http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtension/v1[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/GpxExtensions/v3[/url] http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd">
  <metadata>
    <time>2017-01-01T12:39:42Z</time>
    <link href="http://www.sasgis.org/">
      <text>SAS.Planet</text>
    </link>
    <name>В009</name>
    <author>
      <name>standmit</name>
    </author>
    <bounds maxlat="52.07272" maxlon="113.185333" minlat="52.07272" minlon="113.185333"/>
  </metadata>
  <wpt lat="52.07272" lon="113.185333">
    <name>В009</name>
    <fix>2d</fix>
    <type>user</type>
    <sym>Flag, Blue</sym>
    <link href="files\1.png"/>
    <extensions>
      <gpxx:WaypointExtension>
        <gpxx:DisplayMode>SymbolOnly</gpxx:DisplayMode>
        <gpxx:Categories>
          <gpxx:Category>default</gpxx:Category>
        </gpxx:Categories>
      </gpxx:WaypointExtension>
      <wptx1:WaypointExtension>
        <wptx1:DisplayMode>SymbolOnly</wptx1:DisplayMode>
        <wptx1:Categories>
          <wptx1:Category>default</wptx1:Category>
        </wptx1:Categories>
      </wptx1:WaypointExtension>
    </extensions>
  </wpt>
</gpx>
Нужно получить:
XML
1
2
3
<track>
    <wpt lat="52.07272" lon="113.185333"/>
</track>
Пишу такой XSLT:
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="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="/">
        <track>
            <xsl:apply-templates select="/gpx/wpt"/>
        </track>
    </xsl:template>
    
    <xsl:template match="wpt">
        <xsl:copy>
            <xsl:call-template name="copy-attr"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template name="copy-attr">
        <xsl:for-each select="@*">
            <xsl:copy/>
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>
А на выходе получаю:
XML
1
2
<track>
</track>
И как я не крутил XSLT, шаблон <xslt:template match="wpt>...</xslt:template> никак не хочет выполняться. Почему?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2017, 08:33
Ответы с готовыми решениями:

Почему один код работает, а другой нет?
Здравствуйте, подскажите, пожалуйста, сижу уже который день над этой проблемой, проблема та, впроде...

Почему один массив заполняется нулями, а другой нет?
array&lt;Byte&gt;^inf_mass = gcnew array&lt;Byte&gt;(3016); char inf_mass_2; for (int p = 0; p &lt;3016; p++)...

Один динамик работает, другой нет
Ну, собственно, если комп перезагрузить, то работать начинают оба. На дрова грешить? Или еще...

Как согласовать два ноутбука !!! Один с модулем вай-фай,другой нет...
Заранее благодарю...Есть два ноутбука,один с модулем вай-фай у другого нет...Который с функцией...

1
196 / 178 / 41
Регистрация: 23.10.2015
Сообщений: 764
04.01.2017, 15:30 2
standmit,
Цитата Сообщение от standmit Посмотреть сообщение
И как я не крутил XSLT, шаблон <xslt:template match="wpt>...</xslt:template> никак не хочет выполняться. Почему?
потому что ты не указал пространство имен в преобразовании, и соответственно надо делать выборку из тех пространств имен в которых есть нужные данные

Добавлено через 8 минут
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gpx="http://www.topografix.com/GPX/1/1" 
creator="SAS.Planet 16.06.06.9420" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" 
xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" 
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 [url]http://www.topografix.com/GPX/1/1/gpx.xsd[/url] [url]http://www.garmin.com/xmlschemas/WaypointExtension/v1[/url] [url]http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtension/v1[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/GpxExtensions/v3[/url] http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd">
    
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="/">
        <track>
            <xsl:apply-templates select="gpx:gpx/gpx:wpt"/>
        </track>
    </xsl:template>
    
    <xsl:template match="gpx:wpt">
        <xsl:copy>
            <xsl:call-template name="copy-attr"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template name="copy-attr">
        <xsl:for-each select="@*">
            <xsl:copy/>
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>
но учти, что если ты делаешь копию, то пространство имен тоже будет копироваться

Добавлено через 24 секунды
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gpx="http://www.topografix.com/GPX/1/1" 
creator="SAS.Planet 16.06.06.9420" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" 
xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" 
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 [url]http://www.topografix.com/GPX/1/1/gpx.xsd[/url] [url]http://www.garmin.com/xmlschemas/WaypointExtension/v1[/url] [url]http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtension/v1[/url] [url]http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd[/url] [url]http://www.garmin.com/xmlschemas/GpxExtensions/v3[/url] http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd">
    
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="/">
        <track>
            <xsl:apply-templates select="gpx:gpx/gpx:wpt"/>
        </track>
    </xsl:template>
    
    <xsl:template match="gpx:wpt">
        <xsl:copy>
            <xsl:call-template name="copy-attr"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template name="copy-attr">
        <xsl:for-each select="@*">
            <xsl:copy/>
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>
но учти, что если ты делаешь копию, то пространство имен тоже будет копироваться
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2017, 15:30

Почему один запрос работает, а второй нет?
два случая один работает второй нет :( почему?? что делать?? 1. обращение к таблице в аксесе......

Два практически идентичных кода, но один почему-то работает медленней
Почему мой код работает намного медленнее? Ведь по сути одно и то же! Мой код: int ans = 0; ...

Правильная запись возврата функции или почему один метод работает, а второй нет?
Всем добрый вечере. Появилась такая проблемка, почему такая функция не возвращает мне строку от...

Есть два списка: один [a, b, c], другой [1, 2, 3]. Нужно вывести один список вида [a-1, b-2, c-3]
Помогите решить, пожалуйста. Есть два списка: один , другой . Нужно вывести один список вида


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.