2013-03-14 71 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> 

當這種轉換是應用程序版上所提供的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>JKLMNOPQRST</FormName> 
    <FormName>ABCDEFGH</FormName> 
    <FormName>ABCDEFG</FormName> 
    <FormName>JKLMN</FormName> 
    <FormName>ABCD</FormName> 
</TestData> 
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>