2012-11-15 5 views
1

XSLT 정렬 및 각 그룹에 고유 한 번호 할당 : 정렬 후 각 그룹에 고유 한 번호를 정렬하고 할당하고 싶습니다. xslt를 사용하여 <Type> & <Location>을 기준으로 정렬하십시오. 예상되는 입력 및 출력에 대해서는 아래를 참조하십시오.xslt 정렬 정렬 및 고유 번호 할당

입력 XML :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:Payload xmlns:ns1="http://abcd.ef.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns1:Detail> 
     <ns1:ID>141414</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1214</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>151515</ns1:ID> 
     <ns1:Type>MT</ns1:Type> 
     <ns1:Location>1215</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>313131</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>123123</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>123123</ns1:ID> 
     <ns1:Type>MM</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>112233</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1211</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>112334</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1211</ns1:Location> 
    </ns1:Detail> 
</ns1:Payload> 

출력 XML : 나는 당신의 입력 XML 예상 출력 사이의 불일치가이 비록에 자상을거야

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:Payload xmlns:ns1="http://abcd.ef.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns1:Detail> 
     <ns1:ID>112233</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1211</ns1:Location> 
     <ns1:MsgGroup>1</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>112334</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1211</ns1:Location> 
     <ns1:MsgGroup>1</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>313131</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
     <ns1:MsgGroup>2</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>123123</ns1:ID> 
     <ns1:Type>SS</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
     <ns1:MsgGroup>2</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>123123</ns1:ID> 
     <ns1:Type>MM</ns1:Type> 
     <ns1:Location>1213</ns1:Location> 
     <ns1:MsgGroup>3</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>141414</ns1:ID> 
     <ns1:Type>MT</ns1:Type> 
     <ns1:Location>1214</ns1:Location> 
     <ns1:MsgGroup>4</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
     <ns1:ID>151515</ns1:ID> 
     <ns1:Type>MT</ns1:Type> 
     <ns1:Location>1214</ns1:Location> 
     <ns1:MsgGroup>4</ns1:MsgGroup> 
    </ns1:Detail> 
</ns1:Payload> 
+0

''을 (를)'SS' ...'MM' ...'MT' 순서로 정렬 하시겠습니까? 그것은 일관성이 없습니다. 먼저 ''을 먼저 정렬 한 다음 ''로 정렬 할 수 있습니다. –

+1

출력을 확인하십시오. 입력 XML에는 존재하지 않는 항목이 있습니다. – ABach

+1

XSLT 1.0 또는 2.0? 커뮤니티의 절반이 이전 버전을 사용하고 절반은 새 버전을 사용하고 있으므로 해결 방법은 근본적으로 다를 수 있으므로 실제로 알려줄 필요가 있습니다. –

답변

1

. :) 내가 생산 한 것이 정확하지 않다면 나에게 말할 수있다.

이 XSLT

:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ns1="http://abcd.ef.com" version="1.0"> 
    <xsl:output omit-xml-declaration="no" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:key 
    name="kDetail" 
    match="ns1:Detail" 
    use="concat(ns1:Type, '+', ns1:Location)" /> 

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

    <xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:apply-templates 
     select="ns1:Detail[ 
      generate-id() = 
      generate-id(
      key(' 
       kDetail', 
       concat(ns1:Type, '+', ns1:Location) 
      )[1] 
     ) 
     ]">  
     <xsl:sort select="ns1:Location" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ns1:Detail"> 
    <xsl:variable name="vPos" select="position()" /> 
    <xsl:for-each select="key('kDetail', concat(ns1:Type, '+', ns1:Location))"> 
     <xsl:copy> 
     <xsl:apply-templates /> 
     <ns1:MsgGroup> 
      <xsl:value-of select="$vPos" /> 
     </ns1:MsgGroup> 
     </xsl:copy> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

... 제공된 XML에 대해 실행이 (수정, 나는 불일치를 제거하기 위해, 생각) :

<?xml version="1.0" encoding="UTF-8"?> 
<ns1:Payload 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns1="http://abcd.ef.com"> 
    <ns1:Detail> 
    <ns1:ID>141414</ns1:ID> 
    <ns1:Type>MT</ns1:Type> 
    <ns1:Location>1214</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>151515</ns1:ID> 
    <ns1:Type>MT</ns1:Type> 
    <ns1:Location>1214</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>313131</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>123123</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>123123</ns1:ID> 
    <ns1:Type>MM</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>112233</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1211</ns1:Location> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>112334</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1211</ns1:Location> 
    </ns1:Detail> 
</ns1:Payload> 

. .. 원하는 결과는 (나는 생각한다) 생산했다 :

<?xml version="1.0"?> 
<ns1:Payload 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ns1="http://abcd.ef.com"> 
    <ns1:Detail> 
    <ns1:ID>112233</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1211</ns1:Location> 
    <ns1:MsgGroup>1</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>112334</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1211</ns1:Location> 
    <ns1:MsgGroup>1</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>313131</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    <ns1:MsgGroup>2</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>123123</ns1:ID> 
    <ns1:Type>SS</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    <ns1:MsgGroup>2</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>123123</ns1:ID> 
    <ns1:Type>MM</ns1:Type> 
    <ns1:Location>1213</ns1:Location> 
    <ns1:MsgGroup>3</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>141414</ns1:ID> 
    <ns1:Type>MT</ns1:Type> 
    <ns1:Location>1214</ns1:Location> 
    <ns1:MsgGroup>4</ns1:MsgGroup> 
    </ns1:Detail> 
    <ns1:Detail> 
    <ns1:ID>151515</ns1:ID> 
    <ns1:Type>MT</ns1:Type> 
    <ns1:Location>1214</ns1:Location> 
    <ns1:MsgGroup>4</ns1:MsgGroup> 
    </ns1:Detail> 
</ns1:Payload>