2011-11-02 3 views
3

나는 다음과 같은 형식의 소스 XML이 있습니다병합 XML 노드

<xml> 
    <node> 
     <va-name> 
       <source area="RSC1985s5c1"/> 
     </va-name> 
     <body> 
       <div > 
        <heading>heading 1</heading> 
       </div> 
     </body> 
    </node> 
    <node> 
     <va-name> 
       <source area="RSC1985s5c2"/> 
     </va-name> 
     <body> 
       <div > 
        <heading>heading 2</heading> 
       </div> 
     </body> 
    </node> 

    <node> 
     <va-name> 
       <source area="RSC1985s5c1"/> 
     </va-name> 
     <body> 
       <div > 
        <heading>heading 3</heading> 
       </div> 
     </body> 
    </node> 

<xml> 

내가 원하는 것은 XML/노드/VA-이름/소스 [@area] 값이 differnent들 같은 경우 노드를 병합하는 것입니다 xml/node. xml/node/body 만 복사하고 첫 번째 노드에 병합해야합니다.

출력되어야한다 : 상기 출력

<xml> 
    <node> 
     <va-name> 
       <source area="RSC1985s5c1"/> 
     </va-name> 
     <body> 
       <div > 
        <heading> heading 1 </heading> 
       </div> 
       <div > 
        <heading> heading 3 </heading> 
       </div> 
     </body> 
    </node> 
    <node> 
     <va-name> 
       <source area="RSC1985s5c2"/> 
     </va-name> 
     <body> 
       <div > 
        <heading>heading 2</heading> 
       </div> 
     </body> 
    </node> 
</xml> 

, 노드 (1)와 출력 내가 모두 결합 이유 노드 3 [@area 즉 동일한 XML/노드/VA 이름/소스있어왔다 노드 2는 그대로 출력됩니다. 만약 내가 더 많은 노드가 있고 그것들 중 하나가 일치한다면 (xml/node/va-name/source [@area]) 노드 2와 결합하면 노드 2와 결합 할 것입니다 ...

감사합니다 if 나는 어떤 도움을 얻을 수 ...

+0

어떤 버전을? –

답변

1

아주 쉽게 그룹화 솔루션 :이 스타일 시트는 원하는 출력을 생성 XSLT의

<xsl:template match="xml"> 
<xml> 
    <xsl:for-each-group select="node" group-by="va-name/source/@area"> 
    <node> 
    <xsl:copy-of select="va-name"/> 
    <body> 
     <xsl:copy-of select="current-group()/body/*"/> 
    </body> 
    </node> 
    </xsl:for-each-group> 
</xml> 
</xsl:template> 
+0

Micheal, 원본 노드뿐 아니라 va-name을 출력하도록 약간 수정했습니다. – atif

0

이것은 Muenchian method을 사용하여 가장 잘 해결 된 YAGP (또 다른 그룹화 문제)입니다. XSLT 2.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="byArea" match="node" use="va-name/source/@area" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template 
     match="node[generate-id()= 
        generate-id(key('byArea', va-name/source/@area)[1])]"> 
     <node> 
      <xsl:apply-templates select="va-name" /> 
      <body> 
       <xsl:apply-templates select="key('byArea', va-name/source/@area)" 
        mode="out" /> 
      </body> 
     </node> 
    </xsl:template> 
    <xsl:template match="node" mode="out"> 
     <xsl:apply-templates select="body/div" /> 
    </xsl:template> 
    <xsl:template match="node" /> 
</xsl:stylesheet> 
+1

OP는 XSLT 1.0을 사용하기위한 제약이 있다고 말하지 않았습니다. 그룹화 문제는 2.0에서 훨씬 쉽습니다. –

+0

@Michael - 우수 지점. OP가 XSLT 버전이 필요한지 여부를 알려줄 수 있습니까? –

+0

Thanks Lwburk, 저는 xslt 2.0을 사용하고 있지만 스크립트를 사용해 보았습니다. 완벽하게 작동합니다. – atif