2010-06-21 6 views
1

Возможно ли выполнить преобразование ниже с помощью XSL 1.0. Если да, пожалуйста, напишите какой-нибудь образец кода, который поможет мне начать работу в правильном направлении.XSL 1.0 Преобразование для слияния узлов

<Region> 
<RecType1><Amt> 100 </Amt></RecType1><RecType2><Name>XXX</Name></RecType2><RecType1><Amt> 200 </Amt></RecType1><RecType2><Name>YYY</Name></RecType2><RecType1><Amt> 300 </Amt></RecType1><RecType2><Name>ZZZ</Name></RecType2></Region> 

К

<Region> 
<Payment><Amt>100</Amt><Name>XXX</Name></Payment><Payment><Amt>200</Amt><Name>YYY</Name></Payment><Payment><Amt>300</Amt><Name>ZZZ</Name></Payment></Region> 
+0

Хороший вопрос (+1). См. Мой ответ для полного решения. –

ответ

0

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="RecType1"> 
    <Payment> 
    <xsl:apply-templates select="* | following-sibling::RecType2[1]/*"/> 
    </Payment> 
</xsl:template> 

<xsl:template match="RecType2"/> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML (с отступом, чтобы быть читаемыми):

<Region> 
    <RecType1> 
     <Amt> 100 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>XXX</Name> 
    </RecType2> 
    <RecType1> 
     <Amt> 200 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>YYY</Name> 
    </RecType2> 
    <RecType1> 
     <Amt> 300 </Amt> 
    </RecType1> 
    <RecType2> 
     <Name>ZZZ</Name> 
    </RecType2> 
</Region> 

производит желаемый результат (также отступом, чтобы быть читаемым):

<Region> 
    <Payment> 
     <Amt> 100 </Amt> 
     <Name>XXX</Name> 
    </Payment> 
    <Payment> 
     <Amt> 200 </Amt> 
     <Name>YYY</Name> 
    </Payment> 
    <Payment> 
     <Amt> 300 </Amt> 
     <Name>ZZZ</Name> 
    </Payment> 
</Region> 
Смежные вопросы