Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xslt - cкопировать ноду с аттрибутами (без дочерних нод) / 6 сообщений из 6, страница 1 из 1
29.08.2009, 04:33
    #36168946
Redis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
Нужно скопироавть узел с атрибутами, попутно отредактировав значение некоторых аттрибутов. 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
29.08.2009, 23:52
    #36169361
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
Код: plaintext
<xsl:template match="*|@*">

С уважением, Vasilisk
...
Рейтинг: 0 / 0
30.08.2009, 04:14
    #36169400
Redis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
О спасибо, Ваша подсказка поставила мозги в нужное место )).
У меня ведь уже присутствует шаблон копирующий все дерево:
Код: 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
30.08.2009, 14:31
    #36169523
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xslt - cкопировать ноду с аттрибутами (без дочерних нод)
Код: plaintext
<xsl:template match="@class">

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

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


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