2013-03-14 3 views
1

데이터의 문자 수를 기준으로 XML 출력을 정렬해야합니다. 나는 XSLT 1.0에서 지금까지 그것을 파악할 수 없었다.데이터의 문자 수를 기준으로 XML 데이터 정렬

소스 XML 파일 : 여기에 내가 함께 일하고 무엇

<ROOT> 
<REPLIST> 
    <NAME>ABCDE.xml</NAME> 
    <NAME>ABCDEFGH.xml</NAME> 
    <NAME>ABC.xml</NAME> 
    <NAME>ABCDEFG.xml</NAME> 
    <NAME>ABCD.xml</NAME> 
    <NAME>ABCDEF.xml</NAME> 
    <NAME>JKLMNOPQRST.xml</NAME> 
    <NAME>JKLMNOPQRS.xml</NAME> 
    <NAME>JKLMNOPQ.xml</NAME> 
    <NAME>JKLMN.xml</NAME> 
</REPLIST> 
<DATALIST> 
    <ExtractedName>ABCDEFGH.xml</ExtractedName> 
    <ExtractedName>JKLMN.xml</ExtractedName> 
    <ExtractedName>ABCDEFG.xml</ExtractedName> 
    <ExtractedName>ABCD.xml</ExtractedName> 
    <ExtractedName>JKLMNOPQRST.xml</ExtractedName> 
    <ExtractedName>ABCDEFG.xml</ExtractedName> 
</DATALIST> 
</ROOT> 

출력

<TestData> 
<FormName>ABCDEFGH</FormName> 
<FormName>ABCDEFG</FormName> 
<FormName>ABCD</FormName> 
<FormName>JKLMNOPQRST</FormName> 
<FormName>JKLMN</FormName> 
</TestData> 

원하는 출력 :

<TestData> 
<FormName>JKLMNOPQRST</FormName> 
<FormName>ABCDEFGH</FormName> 
<FormName>ABCDEFG</FormName> 
<FormName>JKLMN</FormName> 
<FormName>ABCD</FormName> 
</TestData> 

스타일 시트 (1.0) :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes"/> 
<xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/> 
<xsl:template match="/"> 
    <TestData> 
     <xsl:apply-templates/> 
    </TestData> 
</xsl:template> 
<xsl:template match="/ROOT/REPLIST/NAME[.=/ROOT/DATALIST/ExtractedName]"> 
    <FormName> 
     <xsl:value-of select="translate(.,'.xml','')"/> 
    </FormName> 
</xsl:template> 
<xsl:template match="text()"> 
</xsl:template> 

이 문제에 대한 도움을 주시면 감사하겠습니다. 여기

답변

1

짧고 간단하게, 더 강력한 솔루션 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:key name="kNameByVal" match="NAME" use="."/> 

<xsl:template match="REPLIST"> 
    <TestData> 
    <xsl:apply-templates select= 
    "key('kNameByVal', /*/DATALIST/*)"> 
    <xsl:sort select="-string-length()" data-type="number"/> 
    </xsl:apply-templates> 
    </TestData> 
</xsl:template> 

<xsl:template match="NAME"> 
    <FormName><xsl:value-of select="substring(.,1, string-length()-4)"/></FormName> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

이 변환이 적용되는 경우 원하는 정확한 결과가을 생산

<ROOT> 
    <REPLIST> 
     <NAME>ABCDE.xml</NAME> 
     <NAME>ABCDEFGH.xml</NAME> 
     <NAME>ABC.xml</NAME> 
     <NAME>ABCDEFG.xml</NAME> 
     <NAME>ABCD.xml</NAME> 
     <NAME>ABCDEF.xml</NAME> 
     <NAME>JKLMNOPQRST.xml</NAME> 
     <NAME>JKLMNOPQRS.xml</NAME> 
     <NAME>JKLMNOPQ.xml</NAME> 
     <NAME>JKLMN.xml</NAME> 
    </REPLIST> 
    <DATALIST> 
     <ExtractedName>ABCDEFGH.xml</ExtractedName> 
     <ExtractedName>JKLMN.xml</ExtractedName> 
     <ExtractedName>ABCDEFG.xml</ExtractedName> 
     <ExtractedName>ABCD.xml</ExtractedName> 
     <ExtractedName>JKLMNOPQRST.xml</ExtractedName> 
     <ExtractedName>ABCDEFG.xml</ExtractedName> 
    </DATALIST> 
</ROOT> 

:

<TestData> 
    <FormName>JKLMNOPQRST</FormName> 
    <FormName>ABCDEFGH</FormName> 
    <FormName>ABCDEFG</FormName> 
    <FormName>JKLMN</FormName> 
    <FormName>ABCD</FormName> 
</TestData> 
제공되는 XML 문서에 에드
1

입니다 당신이 그것을 할 수있는 방법 : 샘플 입력에서 실행

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/> 
    <xsl:key name="kExtract" match="ExtractedName" use="."/> 

    <xsl:template match="/ROOT"> 
    <TestData> 
     <xsl:apply-templates select="REPLIST/NAME[key('kExtract', .)]"> 
     <xsl:sort select="string-length(substring-before(., '.xml'))" 
        data-type="number" order="descending"/> 
     </xsl:apply-templates> 
    </TestData> 
    </xsl:template> 

    <xsl:template match="REPLIST/NAME"> 
    <FormName> 
     <xsl:value-of select="substring-before(., '.xml')"/> 
    </FormName> 
    </xsl:template> 
</xsl:stylesheet> 

, 이것은 생산 :

<TestData> 
    <FormName>JKLMNOPQRST</FormName> 
    <FormName>ABCDEFGH</FormName> 
    <FormName>ABCDEFG</FormName> 
    <FormName>JKLMN</FormName> 
    <FormName>ABCD</FormName> 
</TestData> 
관련 문제