2012-10-10 4 views
0

J'ai un listview qui obtient une source de données xmldatasource. La source xmldatasource est créée et affectée dynamiquement. En utilisant XPath juste avant de se lier les données au listview en utilisantGroupe personnalisé et tri asp: listview datasource xml utilisant XSLT

listview.datasource = myxmlsource 
listview.DataBind() 

seul l'élément de noeud est sélectionné à l'aide xpath="root/node" .Hence Je pense que la structure xml après l'XPath est appliqué se présente comme suit:

<node name="Albert" age="32" desc="some random description" region="north"/> 
<node name="Randy" age="32" desc="some random description" region="south"/> 
<node name="Zebra" age="32" desc="some random description"region="east"/> 
<node name="Bob" age="32" desc="some random description"region="south"/> 
<node name="Carl" age="32" desc="some random description"region="north"/> 
<node name="Denver" age="32" desc="some random description"region="east"/> 

Notez qu'il n'a pas de racine. J'essaye de trier ce XSLT. Le but ici est de grouper le xml par région, puis de trier le xml par le nom . Je suis nouveau à XSLT et il semble être tout à fait une bête.

jusqu'à présent le code xslt je pourrais trouver est:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl my" xmlns:my="http://tempuri.org" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template name="@*|node()"> 

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

</xsl:stylesheet> 

Le résultat attendu après regroupement par région et le tri par nom est:

<node name="Denver" age="32" desc="some random description"region="east"/> 
<node name="Zebra" age="32" desc="some random description"region="east"/> 
<node name="Albert" age="32" desc="some random description" region="north"/> 
<node name="Carl" age="32" desc="some random description"region="north"/> 
<node name="Bob" age="32" desc="some random description"region="south"/> 
<node name="Randy" age="32" desc="some random description" region="south"/> 

Mise à jour:

J'ai oublié de mentionner: L'ordre du groupement par région ne doit pas nécessairement être ascendant ou descendant, mais peut être b ased sur n'importe quelle condition de douane telle que le nord d'abord, l'est deuxième et le tiers du sud. Comment réaliser une commande personnalisée?

J'ai essayé ce qui suit et certains plus de choses semblables et je reçois

Ce document a déjà un nœud « DocumentElement ».

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:template match="@*|node()"> 
      <xsl:copy> 
      <xsl:apply-templates select="node[@region='north']" > 
       <xsl:sort select="@name"/> 
      </xsl:apply-templates> 
      </xsl:copy>  
      <xsl:copy> 
      <xsl:apply-templates select="node[@region='east']" > 
       <xsl:sort select="@name"/> 
      </xsl:apply-templates> 
      </xsl:copy>  
      <xsl:copy> 
      <xsl:apply-templates select="node[@region='south']" > 
       <xsl:sort select="@name"/> 
      </xsl:apply-templates> 
      </xsl:copy> 
     </xsl:template>  

    </xsl:stylesheet> 

Répondre

0

Votre XSLT est presque droite - le modèle doit avoir un match="..." au lieu d'un attribut name="..." - est ici la version de travail:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl my" xmlns:my="http://tempuri.org" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

</xsl:stylesheet>