2013-03-02 4 views
1

Мне нужно сгруппировать некоторые элементы вместе и объединить их под новый элемент.Группировка элементов под новым узлом в xslt

Ниже приведен пример записи, я хотел бы сгруппировать информацию о адресе в дополнительный слой.

Вот своеобразный рекорд -

<Records> 
    <People> 
    <FirstName>John</FirstName> 
    <LastName>Doe</LastName> 
    <Middlename /> 
    <Age>20</Age> 
    <Smoker>Yes</Smoker> 
    <Address1>11 eleven st</Address1> 
    <Address2>app 11</Address2> 
    <City>New York</City> 
    <State>New York</State> 
    <Status>A</Status> 
    </People> 
    </Records> 

Ожидаемый результат: Мне нужно данные группы адресов под новый элемент как таковой -

<Records> 
    <People> 
    <FirstName>John</FirstName> 
    <LastName>Doe</LastName> 
    <Middlename /> 
    <Age>20</Age> 
    <Smoker>Yes</Smoker> 
    <Address>  
     <Address1>11 eleven st</address1> 
     <Address2>app 11</address2> 
     <City>New York</City> 
     <State>New York</State> 
    </Address>  
    <Status>A</Status> 
    </People> 
    </Records> 

Любая помощь будет здорово! Спасибо

ответ

1

Это следует сделать это:

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

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

    <xsl:template match="People"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()[not(self::Address1 or 
                self::Address2 or 
                self::City or 
                self::State)]" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Smoker"> 
    <xsl:call-template name="copy" /> 
    <Address> 
     <xsl:apply-templates select="../Address1 | 
            ../Address2 | 
            ../City | 
            ../State" /> 
    </Address> 
    </xsl:template> 
</xsl:stylesheet> 

При запуске на своем входе XML, это производит:

<Records> 
    <People> 
    <FirstName>John</FirstName> 
    <LastName>Doe</LastName> 
    <Middlename /> 
    <Age>20</Age> 
    <Smoker>Yes</Smoker> 
    <Address> 
     <Address1>11 eleven st</Address1> 
     <Address2>app 11</Address2> 
     <City>New York</City> 
     <State>New York</State> 
    </Address> 
    <Status>A</Status> 
    </People> 
</Records> 
Смежные вопросы