ThomasM: Sortierproblem bei Index

Beitrag lesen

Hallo Holge r,

Problem ist nur das der Index nicht auf 4 Level begrenzt ist und manchmal ziemlich "tief" werden kann. Man könnte ja irgendwie die anzahl der '.' zählen, aber ich dachte es gibt da noch etwas Elegantes.

Hier mal ein allgemeinerer Versuch mit Zählung der durch Punkte getrennten Teile und Sortierung über die Zusammensetzung mit führenden Nullen.

Aus 1.1.1.1 wird 0001000100010001
und aus 1.1.1.1000 wird 0001000100011000
usw.

Probiere es mal damit:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<xsl:stylesheet version="2.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
  xmlns:fn="http://www.w3.org/2005/xpath-functions"  
  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  exclude-result-prefixes="fn xs">  
  
<xsl:template match="wurzel">  
  
<xsl:variable name="n" select="fn:max(for $k in knoten return fn:count(fn:tokenize($k,'\.')))"/>  
  
<xsl:apply-templates select="knoten">  
  <xsl:sort select="fn:number(fn:string-join(for $i in (1 to $n) return fn:concat(fn:string-join(for $i in (1 to 4 - fn:string-length(fn:tokenize(.,'\.')[$i])) return '0',''), fn:tokenize(.,'\.')[$i]),''))" data-type="number" order="ascending"/>  
</xsl:apply-templates>  
  
</xsl:template>  
  
<xsl:template match="knoten">  
  <xsl:value-of select="."/><br />  
</xsl:template>  
  
</xsl:stylesheet>

Getestet am XML-Beispiel:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<wurzel>  
  <knoten>1.1.1.1</knoten>  
  <knoten>1.1.1.15</knoten>  
  <knoten>4.1.1.120</knoten>  
  <knoten>1.1.1.1000</knoten>  
  <knoten>1.10.1.10</knoten>  
  <knoten>2.200.25.10</knoten>  
  <knoten>1.1.1.12</knoten>  
</wurzel>

Ergebnis:
1.1.1.1
1.1.1.12
1.1.1.15
1.1.1.1000
1.10.1.10
2.200.25.10
4.1.1.120

Die XSL-Codestelle ... 1 to 4 ... bezieht sich auf die Anzahl der Stellen pro Segment, hier also bis 4 Stellen. Diese Zahl könnte auch noch dynamisch ermittelt werden ...

Grüße,
Thomas