2012-08-30 4 views
0

XML 파일의 일부 태그를 그룹화하는 데 문제가 있습니다. 태그 nr 다음에 요소를 그룹화하고 새 태그 masini에 넣고 싶습니다. 두 NR가xslt를 사용하는 xml 그룹화

<nota> 
<masini> 
<auto> 
<nr> 1 </nr> 
<bmw>masina tare</bmw> 
<mercedes> masina tiganeasca</mercedes> 
<dacia> masina romaneasca</dacia> 
</auto> 
<auto> 
<nr> 1 </nr> 
<bmw>masina tare</bmw> 
<mercedes> masina tiganeasca</mercedes> 
<dacia> masina romaneasca</dacia> 
</auto> 
</masini> 
<masini> 
<auto> 
<nr> 12 </nr> 
<bmw>2041</bmw> 
<mercedes> masina tdadsa</mercedes> 
<dacia> masina veche</dacia> 
</auto> 
</masini> 
</nota> 

경우 동일한 마시 니 태그에 자신의 요소 2 개 가지 자동 태그가 있어야 동일 : 내가 얻을 싶어

<nota> 
<auto> 
<nr> 1 </nr> 
<bmw>masina tare</bmw> 
<mercedes> masina tiganeasca</mercedes> 
<dacia> masina romaneasca</dacia> 
</auto> 
<auto> 
<nr> 12 </nr> 
<bmw>2041</bmw> 
<mercedes> masina tdadsa</mercedes> 
<dacia> masina veche</dacia> 
</auto> 

<auto> 
<nr> 1 </nr> 
<bmw>masina tare</bmw> 
<mercedes> masina tiganeasca</mercedes> 
<dacia> masina romaneasca</dacia> 
</auto> 
</nota> 

: I는 입력에서이 XML을 . 미안 영어와 사전에 감사합니다.

+0

XSLT2.0을 사용할 수 있습니까? 아니면 XSLT1.0 만 사용할 수 있습니까? –

+0

xslt 1.0 만이 문제를 어떻게 해결해야합니까? 덕분에 – bogdan

답변

1

XSLT1.0에서 가장 효율적인 기술은 Muenchian Grouping입니다.

먼저, xsl : key을 정의하여 그룹의 항목을 조회합니다. 이 경우, 당신은 자동차의 이름 NR 요소 값과 요소를 찾고 있습니다 :

<xsl:key name="auto" match="auto" use="nr" /> 

다음, 당신은 자동차 그룹의 첫 번째 요소 요소를 볼 필요가 (즉, 그들이

<xsl:apply-templates 
    select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" /> 

그런 다음 각 별개의 NR 요소 *의를 선두를 포함, 각 등의 '독특한'요소에 대해, 당신은 g의 모든 요소를 ​​넣어 템플릿 경기를 가질 수 있습니다 새로운 요소 여기

<xsl:template match="auto" mode="group"> 
    <masini> 
     <xsl:apply-templates select="key('auto', nr)" /> 
    </masini> 
</xsl:template> 

내 roup는 샘플 XML에 적용되는 전체 XSLT

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

    <xsl:template match="/*"> 
     <xsl:copy> 
     <xsl:apply-templates select="auto[generate-id() = generate-id(key('auto', nr)[1])]" mode="group" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="auto" mode="group"> 
     <masini> 
     <xsl:apply-templates select="key('auto', nr)" /> 
     </masini> 
    </xsl:template> 

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

이며, 다음은 또한 출력

<nota> 
    <masini> 
     <auto> 
     <nr> 1 </nr> 
     <bmw>masina tare</bmw> 
     <mercedes> masina tiganeasca</mercedes> 
     <dacia> masina romaneasca</dacia> 
     </auto> 
     <auto> 
     <nr> 1 </nr> 
     <bmw>masina tare</bmw> 
     <mercedes> masina tiganeasca</mercedes> 
     <dacia> masina romaneasca</dacia> 
     </auto> 
    </masini> 
    <masini> 
     <auto> 
     <nr> 12 </nr> 
     <bmw>2041</bmw> 
     <mercedes> masina tdadsa</mercedes> 
     <dacia> masina veche</dacia> 
     </auto> 
    </masini> 
</nota> 

, 아이디의 사용을주의입니다 변형은 XML 내의 모든 기존 요소를 복사합니다.

+0

아주 많이 내가 지금 생각을 이해해 주셔서 감사합니다. 좋은 하루 되세요! – bogdan

+1

@bogdan : Tim이 질문에 대한 답을 찾은 것처럼 보입니다. 그것을 upvote 친절한 것이 더 나은 답변으로 표시하는 것이 올바른 것입니다 - 그 경우 ... – Jan