Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с xslt-преобразованием 
:(
    Опции темы
TupleCa
Дата 19.1.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



Здравствуйте.
имеется следующий XML
Код

<doom>
  <lopsters>
    <lopster name="A"/>
    <lopster name="B"/>
    <lopster name="C"/>
  <lopsters>
  
  <bloopers>
    <blooper name="L"/>
    <blooper name="K"/>
  </bloopers>
  
  <vampires>
    <omega name="B"/>
    <omega name="C"/>
    <omega name="K"/>
  </vampires>

</doom>


необходимо написать xsl преобразование, что бы на выходе получился точно такойже xml, но у каждой omega должен появиться новый атрибут nature, имебщий значение blooper или lopster в зависиомти от имени.
например в данном случае, там где B и C будет lopster, а где K будет blooper.
подскажите?
PM   Вверх
mcTep
Дата 20.1.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 25.2.2009

Репутация: 1
Всего: 6



Привет, вот решения:

XSLT 1.0 (xalan):

Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"
    indent="yes"/>
    
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="doom | vampires">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="*"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="lopsters | bloopers">
        <xsl:copy-of select="."/>
    </xsl:template>
    
    <xsl:template match="omega">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:variable name="self" select="."/>
            
            <!-- Вариант 1. Универсальный, но могут быть ошибки при добавлении новых эедементов с аттрибутом @name -->
            <xsl:variable name="nature" select="//*[name(.)!=name($self)][@name=$self/@name]"/>
            <xsl:attribute name="nature1">
                <xsl:value-of select="name($nature)"/>
            </xsl:attribute>
            
            <!--Вариант 2. Надо определить все возможные природные елементы -->
            <xsl:variable name="natures" select="//lopster|//blooper"/>
            <xsl:variable name="nature" select="$natures[@name=$self/@name]"/>
            <xsl:attribute name="nature2">
                <xsl:value-of select="name($nature)"/>
            </xsl:attribute>
        </xsl:copy>
    </xsl:template>
</xsl:transform>


XSLT 2.0 (saxon9):
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"
    indent="yes"/>
    
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="doom | vampires">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="*"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="lopsters | bloopers">
        <xsl:copy-of select="."/>
    </xsl:template>
    
    <xsl:template match="omega">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:variable name="self" select="."/>
            
            <!-- Вариант 1. Универсальный, но могут быть ошибки при добавлении новых эедементов с аттрибутом @name -->
            <xsl:attribute name="nature1" select="name(//*[name(.)!=name($self)][@name=$self/@name])"/>
            
            <!-- Вариант 2. Надо определить все возможные природные елементы -->
            <xsl:attribute name="nature2" select="name(//(lopster|blooper)[@name=$self/@name])"/>
            
        </xsl:copy>
    </xsl:template>
</xsl:transform>



Это сообщение отредактировал(а) mcTep - 20.1.2010, 11:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.