powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / не выводить текст если нет совпадений шаблонов
5 сообщений из 5, страница 1 из 1
не выводить текст если нет совпадений шаблонов
    #37540554
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, подскажите, xml стал разбирать недавно, очень надо, в гугле искал уже - не нашел простого решения. Нужно, чтобы при отсутствии совпадений в xml, xslt не выводил все оставшиеся текстовые узлы. Есть xml:
Код: plaintext
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="WINDOWS-1251"?>
<document>
<partner>
<name>ЗАО</name>
<director>Н М.С.</director>
</partner>
<goodies>
<good id="1">
<price> 245 . 71 </price>
<articul>
<name>Аспирин</name>
</articul>
</good>
<good id="2">
<price> 33 . 72 </price>
<articul>
<name>Анальгин</name>
</articul>
</good>
</goodies>
</document>

xsl к нему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" encoding="windows-1251" indent="yes"/>
        <xsl:template match="/document">
             <header>
             <xsl:apply-templates/>
             </header>
        </xsl:template>
        <xsl:template match="partner/name">
             <xsl:value-of select="."/>;
        </xsl:template>
</xsl:stylesheet>

а выводит следующее:
Код: plaintext
1.
2.
3.
<?xml version="1.0"?>
<header>ЗАО;
        Н М.С. 245 .71Аспирин33.72Анальгин</header>

а надо только
Код: plaintext
1.
2.
<?xml version="1.0"?>
<header>ЗАО;</header>

Подскажите пожалуйста и не отсылайте на гугл, сижу зубрю, разбираюсь, просто времени нет, шеф поставил сроки перед руководством, ни с кем из программеров не посоветовавшись, а никто особо глубоко xml не владеет. Спасибо.
...
Рейтинг: 0 / 0
не выводить текст если нет совпадений шаблонов
    #37540581
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29,

перекройте дефалтовые правила, все или частично.
начинать обработку лучше с рута, меньше неожиданностей:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<xsl:template match="node()" priority="-1" />
<xsl:template match="text()" priority="-1" />
<xsl:template match="/">
    <header>
         <xsl:apply-templates select="document/partner/name"/>
    </header>
</xsl:template>
<xsl:template match="name">
    <xsl:value-of select="."/>;
</xsl:template>
...
Рейтинг: 0 / 0
не выводить текст если нет совпадений шаблонов
    #37540597
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mage.lan,
Код: plaintext
1.
2.
3.
4.
5.
<xsl:template match="/">
    <header>
         <xsl:apply-templates select="document/partner/name"/>
    </header>
</xsl:template>
не пойдет, потому как правил в моем случае может быть очень много. Прописывать их в
Код: plaintext
1.
2.
3.
    <header>
         <xsl:apply-templates select="document/partner/name"/>
    </header>
думаю будет напряжно :(
...
Рейтинг: 0 / 0
не выводить текст если нет совпадений шаблонов
    #37540630
evgen29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mage.lan, помогло следующее, спасибо за подсказку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" encoding="windows-1251" indent="yes"/>
        <xsl:template match="text()" priority="-1" />
        <xsl:template match="/">
             <header>
             <xsl:apply-templates select="*"/>
             </header>
        </xsl:template>
        <xsl:template match="document/partner/name">
             <xsl:value-of select="."/>;
        </xsl:template>
        <xsl:template match="document/partner/director">
             <xsl:value-of select="."/>;
        </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
не выводить текст если нет совпадений шаблонов
    #37540925
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evgen29,

на маленьких задачках - пофиг, но правильно делать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" encoding="windows-1251" indent="yes"/>
        <xsl:template match="text()" priority="-1" />
        <xsl:template match="/">
             <header>
             <xsl:apply-templates select="document/partner"/>
             </header>
        </xsl:template>
        <xsl:template match="partner">
             <xsl:apply-templates select="*" mode="partner"/>
        </xsl:template>
        <xsl:template match="name|director" mode="partner">
             <xsl:value-of select="."/>
             <xsl:text>;</xsl:text>
        </xsl:template>

        <!-- Либо сразу все разбирать в предке, что еще быстрее -->
        <xsl:template match="partner" priority="-1">
             <xsl:value-of select="name"/>
             <xsl:text>;</xsl:text>
             <xsl:value-of select="director"/>
             <xsl:text>;</xsl:text>
        </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / не выводить текст если нет совпадений шаблонов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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