XSLT: сложное преобразование из XML в XML.

Обсуждение вопросов клиентского программирования.

Модератор: Duncon

Ответить
Kottt
Сообщения: 2
Зарегистрирован: 17 мар 2010, 15:22

Встала такая тестовая задачка.

1. Создать XSD схему с типами:

· Комплексный тип – Работник. С элементами: имя, пол, зарплата, название департамента;

· Комплексный тип – Отдел. Атрибуты: название отдела, средняя зарплата по отделу. Элемент: СписокРаботников;

· Комплексный тип – СписокИменРаботников. Элемент – имя работника.

2. Создать XML содержащий 5 работников. Причем 3 работника работают в одном и том же отделе, а остальные в других отделах.

3. Написать XSLT трансформацию, которая трансформирует XML файл со списком Работников в файл со списком Отделов.

Вот что я сделал:

****************************************

Файл firm.xml:

...

Код: Выделить всё

<firm  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="firmScheme.xsd">

	<employee>
		<name>Sirik Sergei Alexandrovich</name>
		<gender>male</gender>
		<salary>600$</salary>
		<depName>A02</depName>
	</employee>	
	<employee>
		<name>Ivanov Ivan Ivanovich</name>
		<gender>male</gender>
		<salary>500$</salary>
		<depName>A02</depName>
	</employee>
	<employee>
		<name>Petrov Ivan Denisovich</name>
		<gender>male</gender>
		<salary>620$</salary>
		<depName>A02</depName>
	</employee>
	<employee>
		<name>Kostukevich Sergi Alexandrovich</name>
		<gender>male</gender>
		<salary>450$</salary>
		<depName>A07</depName>
	</employee>
	<employee>
		<name>Lakizo Inna Anatolievna</name>
		<gender>female</gender>
		<salary>400$</salary>
		<depName>OIC</depName>
	</employee>	
</firm>
*************************************************

Файл firmScheme.xsd:

...

Код: Выделить всё

<xsd:element name="firm" type="firmType"/>
	
	<xsd:element name="comment" type="xsd:string"/>	
	
	<xsd:complexType name="workerType">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string">
			</xsd:element>
			<xsd:element name="gender" type="xsd:string"/>
			<xsd:element name="salary" type="xsd:string"/>
			<xsd:element name="depName" type="xsd:string"/>
		</xsd:sequence>
	</xsd:complexType>
	
	<xsd:complexType name="departmentType">
		<xsd:sequence>
			<xsd:element name="wokersList" type="xsd:string"/>
		</xsd:sequence>
		<xsd:attribute name="depName" type="xsd:string"/>
		<xsd:attribute name="averageSalary" type="xsd:string"/>
	</xsd:complexType>
	
	<xsd:complexType name="nameListWorkersType">
		<xsd:sequence>
			<xsd:element name="workerName" type="xsd:string"/>
		</xsd:sequence>
	</xsd:complexType>
	
	<xsd:complexType name="firmType">
		<xsd:sequence>
			<xsd:element name="employee" type="workerType" maxOccurs="unbounded" minOccurs="0"/>
			<xsd:element name="dep" type="departmentType" minOccurs="0" maxOccurs="unbounded"/>
			<xsd:element name="nameList" type="nameListWorkersType" minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>
 
</xsd:schema>
********************************************************

Ну а с XSLT трансформацией с данными условиями - засада. Я, конечно, мало знаком с XSLT, но пару дней плотно посвятил изучению. И максимум получается трансформация, отображающая список отделов, где встречаются все отделы (даже если атрибут @depName у них одинаковый), ну и соответственно в элементе workersList присутствует только 1 работник.

Помогите, пожалуйста, решить задачку
Kottt
Сообщения: 2
Зарегистрирован: 17 мар 2010, 15:22

Видимо задал сильно общий вопрос)))

ну, а если вот так:

Написал я вот такую трансформацию:

Код: Выделить всё

<xsl:template match="firm">
        <firm>
            <xsl:apply-templates/>
        </firm>
    </xsl:template>
    <xsl:template match="employee">
        <dep>
            <xsl:attribute name="depName">
                <xsl:value-of select="depName"/>
            </xsl:attribute>
            <xsl:attribute name="averageSalary">
                <xsl:value-of select="salary"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </dep>
    </xsl:template>
    <xsl:template match="name">
        <workersList>
            <xsl:apply-templates/>
            <xsl:apply-templates select="name"/>
        </workersList>
    </xsl:template>
    <xsl:template match="gender"/>
    <xsl:template match="depName"/>
    <xsl:template match="salary"/>
И на выходе получается вот такой XML:

Код: Выделить всё

<firm>
<dep depName="A02" averageSalary="600$">
        <workersList>Sirik Sergei Alexandrovich</workersList>
        
        
        
    </dep>
<dep depName="A02" averageSalary="500$">
        <workersList>Ivanov Ivan Ivanovich</workersList>
        
        
        
    </dep>
<dep depName="A02" averageSalary="620$">
        <workersList>Petrov Ivan Denisovich</workersList>
        
        
        
    </dep>
<dep depName="A07" averageSalary="450$">
        <workersList>Kostukevich Sergi Alexandrovich</workersList>
        
        
        
    </dep>
<dep depName="OIC" averageSalary="400$">
        <workersList>Lakizo Inna Anatolievna</workersList>
        
        
        
    </dep>
</firm>
И вот вопрос: Какое условие надо поставить чтобы выводило тег <dep/> с уникальным атрибутом @depName только 1 раз???

P.S.: ещё один маленький вопросик: Как избавиться от пустых строк в полученном XML???
Ответить