Announcement

Collapse
No announcement yet.

xsl:sort und Zugriff auf Folge Elemente

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • xsl:sort und Zugriff auf Folge Elemente

    Hallo an das Forum (bin neu hier).

    ich habe folgende xml-Datei ....
    Code:
    <root>
    	<set id="14" createDate="2">
    		<title>b</title>
    	</set>
    	<set id="7" createDate="4">
    		<title>a</title>
    	</set>
    	<set id="4" createDate="9">
    		<title>d</title>
    	</set>
    	<set id="15" createDate="6">
    		<title>c</title>
    	</set>
    	<set id="18" createDate="5">
    		<title>g</title>
    	</set>
    </root>
    Was ich benötige ist die Liste nach "createDate" zu sortieren (das funktioniert)
    und ich erhalte mit folgendem Code die richtige Reihenfolge:

    Code:
    <xsl:for-each select="/root/set">
      	<xsl:sort select="@createDate" order="descending" />
    	<xsl:value-of select="title"/>
    </xsl:for-each>
    also d,c,g,a,b

    Woran ich im Moment scheiter ist: ich muss innerhalb der sortierten Liste auf das Folge-Element zugreifen.
    Also nicht etwa "following::" da das den Eintrag in der Document-Order ausgibt.
    Wenn ich bei "title a" (id = 7) bin ... das mit dem nächst höherem (niedrigerem) Datum also z.B.: "title g" (id = 18).

    Es steht nur XSLT Version 1.0 zur Verfügung das ganze wird mit (PHP) XSLTProcessor() angestoßen.

    GrußAgundur

  • #2
    mit xsl:variable Knoten speichern und sortieren
    über position dann auf die höhern oder niederen zugreifen




    Code:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output indent="yes" method="html"/>
    	<xsl:template match="/">
    		<xsl:apply-templates select="root"/>
    	</xsl:template>
    	<xsl:template match="root">
    		<xsl:variable name="kn">
    			<xsl:for-each select="set">
    				<xsl:sort select="@createDate" order="descending" data-type="number"/>
    				<xsl:copy-of select="."/>
    			</xsl:for-each>
    		</xsl:variable>
    		
    		<table border="2px">
    			<tr>
    				<th>ID</th>
    				<th>createDate</th>
    				<th>title</th>
    				<th>davor</th>
    				<th>danach</th>
    			</tr>
    			<xsl:for-each select="$kn/set">
    				<tr>
    					<td>
    						<xsl:value-of select="@id"/>
    					</td>
    					<td>
    						<xsl:value-of select="@createDate"/>
    					</td>
    					<td>
    						<xsl:value-of select="./title"/>
    					</td>
    					<td>
    						<xsl:variable name="prev" select="position()-1"/>
    						<xsl:value-of select="$kn/set[$prev]/title"/>
    					</td>
    					<td>
    						<xsl:variable name="next" select="position()+1"/>
    						<xsl:value-of select="$kn/set[$next]/title"/>
    					</td>
    				</tr>
    			</xsl:for-each>
    		</table>
    	</xsl:template>
    </xsl:stylesheet>
    Ergebnis

    Code:
    <table border="2px">
      <tr>
        <th>ID</th>
        <th>createDate</th>
        <th>title</th>
        <th>davor</th>
        <th>danach</th>
      </tr>
      <tr>
        <td>4</td>
        <td>9</td>
        <td>d</td>
        <td></td>
        <td>c</td>
      </tr>
      <tr>
        <td>15</td>
        <td>6</td>
        <td>c</td>
        <td>d</td>
        <td>g</td>
      </tr>
      <tr>
        <td>18</td>
        <td>5</td>
        <td>g</td>
        <td>c</td>
        <td>a</td>
      </tr>
      <tr>
        <td>7</td>
        <td>4</td>
        <td>a</td>
        <td>g</td>
        <td>b</td>
      </tr>
      <tr>
        <td>14</td>
        <td>2</td>
        <td>b</td>
        <td>a</td>
        <td></td>
      </tr>
    </table>

    suchen nach saxon und php
    http://php.net/manual/de/book.xsl.php
    Zuletzt editiert von xml-looser; 16.10.2009, 12:57.

    Comment


    • #3
      Danke für Deine Mühe !

      Das ganze scheitert aber bei mir bei:

      Code:
      <xsl:for-each select="$kn/set">
      Mit dem Fehler: "Failed to evaluate the 'select' expression (Invalid type)"
      Nach einigem Suchen hab ich wohl Hinweise daruf gefunden das es so mit dem (PHP)
      XSLTProcessor wohl nicht funktioniert. "Invalid type" weist wohl darufhin das der Inhalt von "$kn" kein node mehr ist.
      Verwendete Version = 1.1.20 (LIBXSLT_DOTTED_VERSION)

      Gruß Agundur

      Comment


      • #4
        http://sourceforge.net/apps/mediawik...Saxon-from-PHPhttp://www.php.net/manual/de/book.xsl.php#78436
        Zuletzt editiert von xml-looser; 16.10.2009, 17:45.

        Comment

        Working...
        X