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


Автор: TupleCa 19.1.2010, 19:26
Здравствуйте.
имеется следующий 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.
подскажите?

Автор: mcTep 20.1.2010, 11:28
Привет, вот решения:

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>


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