2011-08-06 3 views
0

XML을 다른 데이터 구조로 변환해야합니다. 나는 XML 아래와 같이받을 :XSLT를 사용하여 XML 노드 병합

<results> 
    <resultset> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>730d Saloon</model.model> 
     <model.name>KM21</model.name> 
    </result> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>120i 3 doors</model.model> 
     <model.name>UA51</model.name> 
    </result> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>Z4 sDrive23i</model.model> 
     <model.name>LM31</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model> 
     <model.name>8E2SFZ04</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model> 
     <model.name>4B2BBC04</model.name> 
    </result> 
    <result> 
     <name>AUdi</name> 
     <code>AUDI</code> 
     <model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model> 
     <model.name>4E201L04</model.name> 
    </result> 
    </resultset> 
</results> 

그리고 나는 그것이 이렇게 될 필요

<results> 
    <resultset> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>730d Saloon</model.model> 
     <model.name>KM21</model.name> 
     <model.model>120i 3 doors</model.model> 
     <model.name>UA51</model.name> 
     <model.model>Z4 sDrive23i</model.model> 
     <model.name>LM31</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model> 
     <model.name>8E2SFZ04</model.name> 
     <model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model> 
     <model.name>4B2BBC04</model.name> 
     <model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model> 
     <model.name>4E201L04</model.name> 
    </result> 
    </resultset> 
</results> 

나는이 문제를 해결하기 위해 많은 시간을 보냈지 만 행운까지했습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

+0

XSLT 1.0 또는 2.0을 사용하고 있습니까? –

답변

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

<xsl:key name="groupName" match="//results/resultset/result" use="concat(name, code)" /> 

<xsl:template match="/"> 

    <results> 
    <resultset> 
    <xsl:for-each select="//results/resultset/result[generate-id() = generate-id(key('groupName', concat(name, code)) [1]) ]" > 


     <xsl:call-template name="group"> 
     <xsl:with-param name="k1" select="name" /> 
     <xsl:with-param name="k2" select="code" /> 
     </xsl:call-template> 

    </xsl:for-each> 

    </resultset> 
    </results> 
</xsl:template> 

<xsl:template name="group"> 
<xsl:param name="k1" /> 
<xsl:param name="k2" /> 

    <result> 
     <xsl:copy-of select="name" />  
     <xsl:copy-of select="code" />  

     <xsl:for-each select="//results/resultset/result[name = $k1][code = $k2]"> 

     <xsl:copy-of select="model.model" />  
     <xsl:copy-of select="model.name" />  

     </xsl:for-each> 
    </result> 

</xsl:template> 
</xsl:stylesheet> 
+0

감사합니다. 코드가 완벽하게 작동합니다. – Grigory

0

와 템플릿을 필요로하지 않는다, 나는이 오래된 질문이다 알지만, 허용 대답과는 달리, 짧은, 간단하고 일반적인 푸시 지향 디자인 패턴을 사용합니다, 답변을 제공하고 싶어 매개 변수를 사용하고 트리를 여러 번 완전히 탐색하지 않습니다.

이 XSLT 때 ... 원하는 결과가 생성됩니다

<?xml version="1.0" encoding="UTF-8"?> 
<results> 
    <resultset> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>730d Saloon</model.model> 
     <model.name>KM21</model.name> 
    </result> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>120i 3 doors</model.model> 
     <model.name>UA51</model.name> 
    </result> 
    <result> 
     <name>BMW Cars</name> 
     <code>BMW Pkw</code> 
     <model.model>Z4 sDrive23i</model.model> 
     <model.name>LM31</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model> 
     <model.name>8E2SFZ04</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model> 
     <model.name>4B2BBC04</model.name> 
    </result> 
    <result> 
     <name>Audi</name> 
     <code>AUDI</code> 
     <model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model> 
     <model.name>4E201L04</model.name> 
    </result> 
    </resultset> 
</results> 

:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="no" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="kResultByNameCode" match="result" use="concat(name, '+', code)"/> 

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

    <xsl:template match="result[generate-id() = generate-id(key('kResultByNameCode', concat(name, '+', code))[1])]"> 
    <xsl:copy> 
     <xsl:apply-templates select="name | code"/> 
     <xsl:apply-templates select="key('kResultByNameCode', concat(name, '+', code))/*[starts-with(name(), 'model')]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="result"/> 

</xsl:stylesheet> 

은 ... 제공된 XML에 대해 실행

<results> <resultset> <result> <name>BMW Cars</name> <code>BMW Pkw</code> <model.model>730d Saloon</model.model> <model.name>KM21</model.name> <model.model>120i 3 doors</model.model> <model.name>UA51</model.name> <model.model>Z4 sDrive23i</model.model> <model.name>LM31</model.name> </result> <result> <name>Audi</name> <code>AUDI</code> <model.model>A4 SAL.3.0 Q SPT TIP 5SPD</model.model> <model.name>8E2SFZ04</model.name> <model.model>A6 SAL. 2.5TDI SPORT MAN.6SP.</model.model> <model.name>4B2BBC04</model.name> <model.model>A8 4.2 QUATTRO 6-SPD TIP</model.model> <model.name>4E201L04</model.name> </result> </resultset> </results> 

다시, @ Mike의 답변에 본질적으로 잘못된 것은 없지만, 이것은 훨씬 더 유지 보수가 가능하고 XSLT 파서의 고유 능력을보다 완벽하게 활용합니다.

관련 문제