powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xslt - cкопировать ноду с аттрибутами (без дочерних нод)
6 сообщений из 6, страница 1 из 1
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36168946
Redis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно скопироавть узел с атрибутами, попутно отредактировав значение некоторых аттрибутов. xslt:copy-of не подходит так как копирует все содержимое, а в варианте xslt:copy приходится копировать атрибуты отдельно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<xsl:template match="a">
    <xsl:variable name="href" select="@href" />
    <xsl:copy>
        <xsl:for-each select="@*"><xsl:copy/></xsl:for-each>
        <xsl:attribute name="class">button</xsl:attribute>
        <span class="btn-lc"></span>
            <xsl:apply-templates select="node()" />
            <xsl:if test="substring-before($href,':') = 'http'" >
                [внешняя ссылка]
            </xsl:if>
        <span class="btn-rc"></span>

    </xsl:copy>
</xsl:template>
Наверняка есть более простой способ, большая просьба подсказать его ))
...
Рейтинг: 0 / 0
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36169361
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
<xsl:template match="*|@*">

С уважением, Vasilisk
...
Рейтинг: 0 / 0
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36169400
Redis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О спасибо, Ваша подсказка поставила мозги в нужное место )).
У меня ведь уже присутствует шаблон копирующий все дерево:
Код: plaintext
1.
2.
3.
4.
5.
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
Я просто заменил код копирования аттрибутов на <xsl:apply-templates select="@*" /> :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:template match="a">
    <xsl:copy>
        <xsl:attribute name="class">button</xsl:attribute>
        <xsl:apply-templates select="@*" />
        <span class="a-lc"></span>
            <xsl:apply-templates select="node()" />
            <xsl:if test="substring-before(@href,':') = 'http'" >
                [внешняя ссылка]
            </xsl:if>
        <span class="a-rc"></span>
    </xsl:copy>
</xsl:template>
А потом и вовсе переписал на такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<x:template match="a">
    <a class="button a-scheme-{substring-before(@href,':')}">
        <x:apply-templates select="@*" />
        <span class="a-lc"></span>
            <x:apply-templates select="node()" />
        <span class="a-rc"></span>
    </a>
</x:template>
Вот в связи с последним вариантом, как сделать чтобы копировались все аттрибуты кроме определенного (чтобы вписанный непосредственно class не заменялся на существующий). Можно конечно перечислить нужные аттрибуты:
<x:apply-templates select="@href|@name" />
Но может можно написать другой xPath ?

С непривычки трудно мыслить в этом xslt )) Я третий день как познакомился с этим шаманством ))
...
Рейтинг: 0 / 0
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36169523
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
<xsl:template match="@class">

С уважением, Vasilisk
...
Рейтинг: 0 / 0
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36169807
Redis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм. Да... То есть <xsl:template match="a/@class" /> действительно здесь помогает, и я должен в очередной раз признать, что не увидел очевидного. Но меня все больше настораживает, что я не совсем понимаю каким образом выбирается очередной применяемый шаблон. Точнее меня совершенно не устраивает ответ "первый подходящий" (вроде это так). До тех пор пока количество шаблонов не очень большое, все можно как-то контролировать, но боюсь что в конце концов все превратится в нечто неуправляемое.
У меня отчетливое ощущение что я не понимаю какой-то очень важной детали этой технологии.
Спасибо Вам, что отвечаете не мои дурацкие вопросы ))
...
Рейтинг: 0 / 0
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
    #36169815
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц

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


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