2009-07-02 5 views
3

도와주세요, 저는 XSLT 초보자이고 한 XML 형식을 다른 것으로 변환하려고합니다.XSLT : 고유 한 속성 값 추출

고유 한 속성 값을 추출하여 값을 새로운 형식으로 변환해야합니다. 아래 예제 XML은 원래 및 새/대상 형식을 보여줍니다.

나는 이것을 즐기기 위해 오래 동안 노력해 왔습니다. 누구든지 도와 주거나 조언을 해줄 수 있습니까?

원본 형식 :

<base> 
    <level> 
    <level2 Name ="AA" value="1"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="2"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="3"/> 
    </level> 
    <level> 
    <level2 Name ="CC" value="4"/> 
    </level> 
    <level> 
    <level2 Name ="AA" value="5"/> 
    </level> 
</base> 

새로운 형식 :

<base> 
    <levelNames> 
    <level level2Name ="AA"/> 
    <level level2Name ="BB"/> 
    <level level2Name ="CC"/> 
    </levelNames> 
</base> 

고마워요.

+1

지금까지 시도한 XSLT를 게시하고 제안을하겠습니다. – skaffman

답변

2

다시 한번 Muenchian grouping technique이 누락 된 것으로 보입니다.

매우 사소한 문제이므로 Muench와 손을 잡기 위해 자신의 작업을 수행하도록하겠습니다.

+0

투표를하고 투표를 진행하며 해결책을 게시하고 죄책감을 느끼는 것 사이에는 양립성이 없습니다. 젠장. :-D 그러나 당신은 이것이 아마도 숙제라고 의심하는 것이 옳다. 그래서 나는 자제한다. – Tomalak

+0

한 번 해보신다면 실제로 얼마나 쉬운 지 알 수 있습니다. 아이디어를 얻어야합니다. 가장 일반적인 XSLT 문제의 경우 여기에서 먼저 살펴 보도록 권장합니다. http://www.dpawson.co.uk/xsl/sect2/sect21.html – Boldewyn

+1

내 계획이 작동했습니다! annakata

0

먼저 xsl : key를 작성하여 다음 코드를 쉽게 사용할 수 있습니다.

XSL : 키 이름 = "levelName"일치 = "레벨 2"사용 =

<xsl:template match="/"> 
<xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="base"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:element name="levelNames"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:element> 
</xsl:template> 

    <xsl:template match="level"> 
     <xsl:for-each select="level2[count(.|key('levelName', @Name)[1]) = 1]"> 
      <xsl:sort order="ascending" data-type="text" select="@Name"/> 
      <xsl:element name="{local-name(..)}"> 
       <xsl:attribute name="level2Name"> 
        <xsl:value-of select="@Name"/> 
       </xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
    </xsl:template> 
9

XSLT SOLN "이름 @"

<?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="LevelDistint" match="level2" use="@Name"/> 
    <xsl:template match="base"> 
     <base> 
      <levelNames> 
       <xsl:for-each select="level/level2[generate-id() = generate-id(key('LevelDistint', @Name)[1])]"> 
        <level> 
         <xsl:attribute name="level2Name"><xsl:value-of select="normalize-space(@Name)"/></xsl:attribute> 
        </level> 
       </xsl:for-each> 
      </levelNames> 
     </base> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT의 O/P :

<?xml version="1.0" encoding="UTF-8"?> 
<base> 
    <levelNames> 
     <level level2Name="AA"/> 
     <level level2Name="BB"/> 
     <level level2Name="CC"/> 
    </levelNames> 
</base>