2013-10-15 2 views
1

다른 "사용자"와 부모 - 자식 관계가있는 "사용자"의 단일 플랫 목록이 있습니다. 사용자의 "상위"는 approverID입니다. 목록에서 부모를 선행하는 어린이가 XSLT 2.0을 사용할 수 없도록이 목록을 정렬해야합니다. 예 입력 XML :XSLT : 부모가 목록에있는 자식보다 먼저 정렬되도록 정렬

<userList> 
    <user> 
     <userID>4</userID> 
     <approverID>2</approverID> 
    </user> 
    <user> 
     <userID>5</userID> 
     <approverID>2</approverID> 
    </user> 
    <user> 
     <userID>3</userID> 
     <approverID>1</approverID> 
    </user> 
    <user> 
     <userID>2</userID> 
     <approverID>1</approverID> 
    </user> 
    <user> 
     <userID>1</userID> 
     <approverID>10</approverID> 
    </user> 
    <user> 
     <userID>6</userID> 
     <approverID>7</approverID> 
    </user> 
    <user> 
     <userID>7</userID> 
     <approverID>10</approverID> 
    </user> 
</userList> 

같은 부모 자식 구조 (그것을 보여주는하지 않도록 최선의 방법)
일이겠습니까 {2 {4,5}, 3}
7 {6}

그리고 출력 XML은 유일한 요구 사항은 하위 사용자가 부모 앞에 오는 결코이지만, 어쨌든 정렬 할 수 이외의

<userList> 
    <user> 
     <userID>1</userID> 
     <approverID>10</userID> 
    </user> 
    <user> 
     <userID>2</userID> 
     <approverID>1</approverID> 
    </user> 
    <user> 
     <userID>3</userID> 
     <approverID>1</approverID> 
    </user> 
    <user> 
     <userID>4</userID> 
     <approverID>2</approverID> 
    </user> 
    <user> 
     <userID>5</userID> 
     <approverID>2</approverID> 
    </user> 
    <user> 
     <userID>7</userID> 
     <approverID>10</approverID> 
    </user> 
    <user> 
     <userID>6</userID> 
     <approverID>7</approverID> 
    </user> 
</userList> 

같은 것을 볼 수 있었다. 재귀 적으로이 작업을 수행 할 수 있다고 생각하지만 XSLT와 같은 함수형 프로그래밍 언어에서는 이것이 최선의 선택이 아닙니다.

답변

1

은 입력과 출력 사이에 불일치가 될 것 같다 (나는 당신의 출력은 두 곳에서 귀하의 요구 사항을 위반하는 생각)하지만 나는 이것이 당신이려고하고있는 무슨 생각 :에 실행하면

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
    <xsl:key name="kUserByApprover" match="user" use="approverID"/> 
    <xsl:key name="kUserById" match="user" use="userID"/> 

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

    <xsl:template match="userList"> 
    <xsl:copy> 
     <!-- Process users whose approver is not present --> 
     <xsl:apply-templates select="user[not(key('kUserById', approverID))]" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="user"> 
    <xsl:call-template name="copy" /> 
    <!-- Process child users --> 
    <xsl:apply-templates select="key('kUserByApprover', userID)" /> 
    </xsl:template> 
</xsl:stylesheet> 

결과가 다음과 같습니다.

<userList> 
    <user> 
    <userID>1</userID> 
    <approverID>10</approverID> 
    </user> 
    <user> 
    <userID>3</userID> 
    <approverID>1</approverID> 
    </user> 
    <user> 
    <userID>2</userID> 
    <approverID>1</approverID> 
    </user> 
    <user> 
    <userID>4</userID> 
    <approverID>2</approverID> 
    </user> 
    <user> 
    <userID>5</userID> 
    <approverID>2</approverID> 
    </user> 
    <user> 
    <userID>7</userID> 
    <approverID>10</approverID> 
    </user> 
    <user> 
    <userID>6</userID> 
    <approverID>7</approverID> 
    </user> 
</userList> 
+0

감사합니다. JL, 입력 XML과 일치하지 않는 두 개의 출력 레코드를보고 수정했습니다. 내 실제 XML 스키마는 조금 다르지만 업데이트하는 데 문제가 있어서는 안됩니다. 도와 주셔서 감사합니다. 문제가 있으면 알려 드리겠습니다. – rwolters3

관련 문제