Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Обернуть некоторые ноды


Автор: lusever 29.5.2007, 00:14
Дан xml:
Код

<root>
    <div>1</div>
    <div span="true1">2</div>
    <block>
        <all span="true2">content all</all>
        <all>2 all</all>
    </block>
</root>


Нужно, чтобы строковые значения с атрибутом span="...", оборачивались xslt в мой <span class="class-name"></span>.

Проблема вообщем-то в том, что исходный xslt файл нам неизвестен, т.е. править его нельзя. Мы его импортируем например из: <xsl:import href="xz.xsl"/> в my.xsl.
Далее, в my.xsl я делаю так:
Код

<xsl:template match="*[@span]">
    <span class="class-name"><xsl:apply-imports/></span>
</xsl:template>


Но есть загвоздка. Код обрабатывает лишь те ноды, которые в xz.xsl обрабатываются так:
Код

<xsl:template match="div">
    <xsl:value-of select="."/>
</xsl:template>


А те что в xz.xsl:
Код

<xsl:template match="block">
    <xsl:value-of select="all"/>
</xsl:template>
 просто забываются.

Как мне это побороть? xz.xsl менять нельзя.

Автор: lusever 29.5.2007, 15:45
Цитата(JVM @  29.5.2007,  10:33 Найти цитируемый пост)
И это правильно 
У вас шаблон <xsl:template match="*[@span]">, а у <block> нет атрибута @span.


Спасибо за то, что создали новую тему и ответили мне. Советую, при необходимости ответить, использовать другой браузер. У меня Firefox тоже местами глючит.

Мне block не надо обрамлять. 
Надо, что бы <xsl:value-of select="all"/> уже содержал необходимый <span class="class-name">.

Автор: _Valery 29.5.2007, 19:37
lusever, шаблон
Код

<xsl:template match="*[@span]">
    <span class="class-name"><xsl:apply-imports/></span>
</xsl:template>

выберет:
Код

<div span="true1">2</div>

и
Код

<all span="true2">content all</all>

А xz.xsl обработает только первый из них.

Автор: lusever 29.5.2007, 22:18
Я прекрасно понимаю, что этот метод сработает только для первого случая. А как нужно мне сделать, чтобы первый и второй случай работали (как можно универсальнее).

Автор: _Valery 30.5.2007, 11:41
lusever, изменить/дополнить xz.xsl, потому что тот же
Код

<xsl:template match="block">
    <xsl:value-of select="all"/>
</xsl:template>

непонятно зачем нужен в контексте данной задачи.

Автор: lusever 30.5.2007, 13:23
Повторюсь. xz.xsl, к сожалению, изменять нельзя. Не знаю уже как вывернуться. Неделю бьюсь.

Автор: _Valery 30.5.2007, 18:44
lusever, обработка узлов, содержащих атрибут span  должна происходить именно в xz.xsl?
Вообще говоря, вижу два возможных варианта: 
    • дописать дополнительные шаблоны в my.xsl;
    • переписать уже имеющуюся выборку узлов в my.xsl и ничего не менять в xz.xsl, но это будет работать только в предоставленном вами  
       xml-документе, то есть даже смена порядка следования узлов all все собьет.

Автор: lusever 30.5.2007, 19:10
Если можно, попjдробнее про дописать шаблон в my.xsl.

Автор: _Valery 31.5.2007, 17:35
Например:
Код

    <xsl:template match="block">
        <xsl:for-each select="*[@span]">
            <span class="class-name">
                <xsl:value-of select="."/>
            </span>
        </xsl:for-each>
    </xsl:template>

Автор: lusever 31.5.2007, 19:34
Очень хорошо.
Вы забыли про <xsl:apply-imports/>.
Никто не знает что они там в xz.tpl натворят.

Автор: _Valery 31.5.2007, 20:22
Цитата(lusever @  31.5.2007,  19:34 Найти цитируемый пост)
Вы забыли про <xsl:apply-imports/>.
Никто не знает что они там в xz.tpl натворят. 
 поясните.

Автор: lusever 31.5.2007, 21:07
К примеру, в xz.xsl кто-то написал:
Код

<xsl:template match="block">
    <div>
        <h1>Новость:</h1>
            <xsl:value-of select="all"/>
    </div>
</xsl:template>


И надо чудесным образом, превратить в:
Код

<xsl:template match="block">
    <div>
        <h1>Новость:</h1>
            <!-- <добавлено из my.xsl> -->
            <span class="class-name">
            <!-- </> -->
                <xsl:value-of select="all"/>
            <!-- <добавлено из my.xsl> -->
            </span>
            <!-- </> -->
    </div>
</xsl:template>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)