2016-06-29 2 views
0
다음과 같이

내 소스 XML 보이는 : A들과 B의 항상 XY의 값에 대한 페어를 발생한다는XSLT : 그룹 다른 요소 유형

<A> 
    <item> 
    <X>10</X> 
    <Y>20</Y> 
    <Data1>Foo</Data1> 
    </item> 
</A> 
<B> 
    <item> 
    <X>10</X> 
    <Y>20</Y> 
    <Data2>Bar</Data2> 
    </item> 
</B> 
<A> 
    <item> 
    <X>11</X> 
    <Y>20</Y> 
    <Data1>Foo2</Data1> 
    </item> 
</A> 
<B> 
    <item> 
    <X>11</X> 
    <Y>20</Y> 
    <Data2>Bar2</Data2> 
    </item> 
</B> 

참고. 무시되어야하는 중첩 된 item 요소를 포함하는 다른 요소도 있음에 유의하십시오. 이제 내 목표는 그룹이처럼 보이는 X에 대해 동일한 값을 갖는 요소와 새로운 요소로 Y입니다 : 내가 Muenchian 그룹에 대해 읽고

<NewElement> 
    <X>10</X> 
    <Y>20</Y> 
    <Data1>Foo</Data1> 
    <Data2>Bar</Data2> 
</NewElement> 
<NewElement> 
    <X>11</X> 
    <Y>20</Y> 
    <Data1>Foo2</Data1> 
    <Data2>Bar2</Data2> 
</NewElement> 

하지만 보인다 같은 요소에 대한이 유일한 작품 (예를 들어, 나의 예에서는 XY에 대해 동일한 값을 가진 모든 A을 그룹화 할 수 있습니다. 다른 요소를 어떻게 그룹화 할 수 있습니까?

+1

만약 내가 제대로 설명을 이해하고,이 정말 약 아니다 그룹화. 각 'A'에 대해 'NewElement'를 만들고 현재 'A'와 해당 'B'의 데이터로 채우기 만하면됩니다. –

+0

나는 네가 옳았다 고 생각한다. 어리 석다. 내 솔루션을 게시 할 것입니다. (아마 이해하기가 좀 더 쉬울 것입니다.) 그 대답을 받아들입니다. "대답은 유용합니다"크레딧에 만족하게되기를 바랍니다 ... – csoltenborn

답변

0

마이클이 옳았습니다. 내 문제를 그룹화 할 필요가 없습니다. 여기에 내가 아마 그에게 게시 한만큼 우아하지 않은, 사용하여 종료 솔루션,하지만 어쩌면 쉽게 조금 이해 (?)

<xsl:template match="A/item"> 
    <NewElement> 
    <X><xsl:value-of select="X"/></X> 
    <Y><xsl:value-of select="Y"/></Y> 
    <Data1><xsl:value-of select="Data1"/></Data1> 
    <Data2> 
     <xsl:variable name="localX" select="X"/> 
     <xsl:variable name="localY" select="Y"/> 
     <xsl:value-of select="../../B/item[X = $localX and Y = $localY]/Data2"/> 
    </Data2> 
    </NewElement> 
</xsl:template> 
1

다음 스타일 1.0

<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="b" match="B/item" use="concat(X, '|', Y)" /> 

<xsl:template match="/root"> 
    <root> 
     <xsl:for-each select="A/item"> 
      <NewElement> 
       <xsl:copy-of select="*"/> 
       <xsl:copy-of select="key('b', concat(X, '|', Y))/Data2"/> 
      </NewElement> 
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

는 (!가 잘 형성하게하는 root 원소를 첨가 후)하여 입력 예인가

XSLT는 생산 :

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <NewElement> 
     <X>10</X> 
     <Y>20</Y> 
     <Data1>Foo</Data1> 
     <Data2>Bar</Data2> 
    </NewElement> 
    <NewElement> 
     <X>11</X> 
     <Y>20</Y> 
     <Data1>Foo2</Data1> 
     <Data2>Bar2</Data2> 
    </NewElement> 
</root>