xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

объединение значений одинаковых элементов


Автор Сообщение
dannis
Новичок

Зарегистрирован: 02.03.2009
Сообщения: 1

[13601] Пн Мар 02, 2009 02:12
объединение значений одинаковых элементов
Всем привет,

помогите pls решить следующую задачу.

есть исходный XML вида:

Код:



<Order>
   <Purchaser>1</Purchaser>
   <PurchNumber>0001</PurchNumber>
   <Article>
      <Number>10001</Number>
      <Description>Диван угловой</Description>
      <Description>желтый полистирол</Description>
      <Description>высота 1100</Description>
      <Price>100.00</Price>
      <Qty>2</Qty>
   </Article>
   <Article>
      <Number>10001</Number>
      <Description>Кресло массажное</Description>
      <Description>цвет черный кожа</Description>
      <Description>высота 1200</Description>
      <Price>50.00</Price>
      <Qty>10</Qty>
   </Article>
   <Article>
      ...
      ...
   </Article>
   ...
   <TotalWeight>1200</TotalWeight>
   <TotalAmount>500000</TotalAmount>
</Order>



на выходе необходимо объединить значения элементов <Description> в один элемент для каждого артикула. Все остальные элементы исходного документа должны остаться без изменений.

Т.е. выходной документ должен выглядеть так:

Код:



<Order>
   <Purchaser>1</Purchaser>
   <PurchNumber>0001</PurchNumber>
   <Article>
      <Number>10001</Number>
      <Description>Диван угловой желтый полистирол высота 1100</Description>
      <Price>100.00</Price>
      <Qty>2</Qty>
   </Article>
   <Article>
      <Number>10001</Number>
      <Description>Кресло массажное цвет черный кожа высота 1200</Description>
      <Price>50.00</Price>
      <Qty>10</Qty>
   </Article>
   <Article>
      ...
      ...
   </Article>
   ...
   <TotalWeight>1200</TotalWeight>
   <TotalAmount>500000</TotalAmount>
</Order>



Заранее спасибо!
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13604] Пн Мар 02, 2009 23:46

Код:

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="Description">
     <xsl:if test="not(preceding-sibling::Description)">
       <Description>
         <xsl:apply-templates select="../Description" mode="concat"/>
       </Description>
     </xsl:if>
   </xsl:template>

   <xsl:template match="Description" mode="concat">
     <xsl:value-of select="."/>
   </xsl:template>

   <xsl:template match="*">
     <xsl:element name="{name()}">
       <xsl:apply-templates/>
     </xsl:element>
   </xsl:template>
</xsl:stylesheet>


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]