2017-10-15 12 views
0

Voici ma source de données xml:XSL à Xml avec l'erreur de tri

<?xml version="1.0" ?> 
<data> 
<quarter qt="3"> 
<PostCode> 
<Code abbr="2000"></Code> 
<Learner>1,116</Learner> 
<P1>99993</P1> 
<P2>402</P2> 
<Unrestricted>10,137</Unrestricted> 
<ClassC>11564</ClassC> 
<ClassLR>69</ClassLR> 
<ClassMR>74</ClassMR> 
<ClassHR>108</ClassHR> 
<ClassHC>43</ClassHC> 
<ClassMC>4</ClassMC> 
<ClassR>976</ClassR> 
</PostCode> 
<PostCode> 
<Code abbr="2000"></Code> 
<Learner>3</Learner> 
<P1>11</P1> 
<P2>3000000000000</P2> 
<Unrestricted>14</Unrestricted> 
<ClassC>20</ClassC> 
<ClassLR>0</ClassLR> 
<ClassMR>1</ClassMR> 
<ClassHR>1</ClassHR> 
<ClassHC>0</ClassHC> 
<ClassMC>0</ClassMC> 
<ClassR>3</ClassR> 
</PostCode> 
<PostCode> 
<Code abbr="2006"></Code> 
<Learner>389</Learner> 
<P1>103</P1> 
<P2>177</P2> 
<Unrestricted>2,682</Unrestricted> 
<ClassC>3,242</ClassC> 
<ClassLR>14</ClassLR> 
<ClassMR>34</ClassMR> 
<ClassHR>37</ClassHR> 
<ClassHC>9</ClassHC> 
<ClassMC>0</ClassMC> 
<ClassR>317</ClassR> 
</PostCode> 
</quarter> 
</data> 

Et voici ma xsl source de

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:param name="Code"/> 
<xsl:param name="quarter"/> 
<xsl:param name="sortBy" select="'ClassC'"/> 
<xsl:param name="order" select="'descending'"/> 

<xsl:template match="data"> 
<data> 
<quarter> 

<xsl:apply-templates select="quarter[@qt=$quarter]"> 
</xsl:apply-templates> 
</quarter> 
</data> 
</xsl:template> 

<xsl:template match="quarter"> 
<xsl:apply-templates select="PostCode/Code[@abbr=$Code]" > 
</xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Code"> 
<xsl:for-each select=".."> 
<xsl:sort select="ClassC" data-type="number" order="descending"/> 
//here is my key code 
<xsl:copy-of select="."/> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Cependant je ne peux pas trier par le " ClassC "et le résultat est

?xml version="1.0" encoding="UTF-8"?><data><quarter><PostCode> 
<Code abbr="2000"/> 
<Learner>1,116</Learner> 
<P1>99993</P1> 
<P2>402</P2> 
<Unrestricted>10,137</Unrestricted> 
<ClassC>11564</ClassC> 
<ClassLR>69</ClassLR> 
<ClassMR>74</ClassMR> 
<ClassHR>108</ClassHR> 
<ClassHC>43</ClassHC> 
<ClassMC>4</ClassMC> 
<ClassR>976</ClassR> 
</PostCode><PostCode> 
<Code abbr="2000"/> 
<Learner>3</Learner> 
<P1>1111111111111</P1> 
<P2>3</P2> 
<Unrestricted>14</Unrestricted> 
<ClassC>200000000000</ClassC> 
<ClassLR>0</ClassLR> 
<ClassMR>1</ClassMR> 
<ClassHR>1</ClassHR> 
<ClassHC>0</ClassHC> 
<ClassMC>0</ClassMC> 
<ClassR>3</ClassR> 
</PostCode> 
</quarter> 
</data> 

Salut tout le monde, on m'a demandé de commander les données XML par = Classe C et faire d'autres choses plus tard. Mais j'ai rencontré un problème très difficile! Quelqu'un peut-il me dire comment faire cela? Parce que je ne sais pas chaud pour résoudre ce problème? Il est tout à fait werid!

+0

Pourriez-vous s'il vous plaît réduire votre XML pour les parties où un problème se produit? QUEL problème se produit réellement? Quel logiciel est utilisé ... Cette question n'est pas claire du tout! –

Répondre

0

Vous ne l'avez pas bien expliqué quel résultat vous voulez respectivement les éléments que vous voulez trier, si vous voulez trier les PostCode éléments alors ici est un exemple fait que, simplement en vous assurant que le xsl:sort est utilisé pour un xsl:apply-templates sur la PostCode éléments:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:param name="Code">2000</xsl:param> 
    <xsl:param name="quarter">3</xsl:param> 
    <xsl:param name="sortBy" select="'ClassC'"/> 
    <xsl:param name="order" select="'descending'"/> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="data"> 
     <data> 
      <quarter>    
       <xsl:apply-templates select="quarter[@qt=$quarter]"/>     
      </quarter> 
     </data> 
    </xsl:template> 

    <xsl:template match="quarter"> 
     <xsl:apply-templates select="PostCode[Code[@abbr=$Code]]" > 
      <xsl:sort select="Code/*[local-name() = $sortBy]" order="{$order}" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:template> 

</xsl:transform> 

en ligne à http://xsltransform.net/bEzjRKS, le résultat est

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <quarter> 
     <PostCode> 
     <Code abbr="2000"/> 
     <Learner>1,116</Learner> 
     <P1>99993</P1> 
     <P2>402</P2> 
     <Unrestricted>10,137</Unrestricted> 
     <ClassC>11564</ClassC> 
     <ClassLR>69</ClassLR> 
     <ClassMR>74</ClassMR> 
     <ClassHR>108</ClassHR> 
     <ClassHC>43</ClassHC> 
     <ClassMC>4</ClassMC> 
     <ClassR>976</ClassR> 
     </PostCode> 
     <PostCode> 
     <Code abbr="2000"/> 
     <Learner>3</Learner> 
     <P1>11</P1> 
     <P2>3000000000000</P2> 
     <Unrestricted>14</Unrestricted> 
     <ClassC>20</ClassC> 
     <ClassLR>0</ClassLR> 
     <ClassMR>1</ClassMR> 
     <ClassHR>1</ClassHR> 
     <ClassHC>0</ClassHC> 
     <ClassMC>0</ClassMC> 
     <ClassR>3</ClassR> 
     </PostCode> 
    </quarter> 
</data>