powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XML::LibXML
6 сообщений из 6, страница 1 из 1
XML::LibXML
    #38170050
blocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый!

Есть 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.
<?xml version="1.0" encoding="UTF-8"?>
<book>
    <chapter id="1">
        <page id="1">
            <para id="1" type="text"> 1 First para <label id="1">1 First label</label>
            </para>
            <para id="2" type="text"> 1 Second para <table>
                    <para id="3" type="tabletext">1 Table para</para>
                </table>
            </para>
        </page>
    </chapter>
    <chapter id="2">
        <page id="1">
            <para id="4" type="text"> 2 First para </para>
            <para id="5" type="text"> 2 Second para <table id="table">
                    <tr>
                        <td>
                            <para id="6" type="tabletext">2 Table para </para>
                            <label id="2">2 Second label</label>
                        </td>
                    </tr>
                </table>
            </para>
        </page>
    </chapter>
</book>


И XSL файл:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:template match="book">
        <xsl:apply-templates select="chapter//para"/>
    </xsl:template>
    <xsl:template match="label"/>
    <xsl:template match="para"/>
    <xsl:template match="para[@type='tabletext']"> ID <xsl:value-of select="@id"/>:&#160;<xsl:value-of select="."/>
        <xsl:text>&#x0a;</xsl:text>
    </xsl:template>
</xsl:stylesheet>


Если использовать Oxygen или даже xsltproc то получится желаемое:
Код: html
1.
2.
 ID 3: 1 Table para
 ID 6: 2 Table para


Но если использовать XML::LibXML
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
#!/usr/bin/perl
use XML::LibXML; 
use XML::LibXSLT;
my $parser=XML::LibXML->new();
my $xslt=XML::LibXSLT->new();
my $stylesheet=$xslt->parse_stylesheet_file('test.xsl');
my $doc=$parser->parse_file('test.xml');
print $stylesheet->output_string($doc);


То результат будет совсем другим:
Код: html
1.
2.
3.
4.
5.
6.
7.
1 First para 1 First label
             1 Second para 
                    1 Table para
             2 First para 
             2 Second para 
                            2 Table para 
                            2 Second label


То есть применятся все преобразования! Кто может растолковать в чём я не прав?
Заранее благодарен.
...
Рейтинг: 0 / 0
XML::LibXML
    #38170393
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blockerКто может растолковать в чём я не прав?Применяется первый подходящий шаблон. Сделайте такой XSL
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>

    <xsl:template match="book">
        <xsl:apply-templates select="chapter//para"/>
    </xsl:template>

    <xsl:template match="label"/>

    <xsl:template match="para[@type='tabletext']"> ID <xsl:value-of select="@id"/>:&#160;<xsl:value-of select="."/>
        <xsl:text>&#x0a;</xsl:text>
    </xsl:template>

    <xsl:template match="para"/>
</xsl:stylesheet>

и будет Вам счастье
...
Рейтинг: 0 / 0
XML::LibXML
    #38170399
blocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, спасибо, действительно, так и есть! Работает.

Как я мог об этом забыть? Перетрудился :(
...
Рейтинг: 0 / 0
XML::LibXML
    #38171304
blocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчера я точно перетрудился мозгом. Проверил решение старым методом:

xsltproc test.xsl test.xml

А он ведь и раньше работал.

Сегодня вставил правки в программу -- по-прежнему не работает как надо. Судя по всему XML::LibXML понимает xsl не совсем так, как xsltproc

Может быть у кого-то ещё есть мысли?
...
Рейтинг: 0 / 0
XML::LibXML
    #38171473
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blockerМожет быть у кого-то ещё есть мысли?Т.е. мой вариант не работает?
...
Рейтинг: 0 / 0
XML::LibXML
    #38171551
blocker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, нет, не работал. Там дело было не в этом. Нашёл ошибку, она была совсем в другом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
use XML::LibXML; 
use XML::LibXSLT;
my $parser=XML::LibXML->new();
my $xslt=XML::LibXSLT->new();
my $stylesheet=$xslt->parse_stylesheet_file('test.xsl');
my $doc=$parser->parse_file('test.xml');
my $transformed_document=$stylesheet->transform($doc); <-------------------- ПРИМЕНИТЬ ШАБЛОНЫ!!!
print $stylesheet->output_string($transformed_document);



Т.е. парсер всё делал правильно, ему действительно нужно было сделать для всего документа apply-templates. А я его просил распечатать результат, пропустив инструкцию transform. Вот он мне и выводил абсолютно все ноды.

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


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