Announcement

Collapse
No announcement yet.

Sortieren und erstes Element auswählen, node-set

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

  • Sortieren und erstes Element auswählen, node-set

    Hallo,

    ich muss Elemente sortieren und dann das erste Element dieser Liste auswählen, damit ich davon ein Subelement abfragen kann. Ist wahrscheinlich trivial, aber ich bekomms nicht hin.
    1. Kann mir jemand eine generelle Vorgehensweise für dieses Problem nennen?
    2. Mein aktueller Versuch
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="C:\Programmierung\xslt\SortDate2.xsl"?>
    <bafoeg>
    	<bwz>
    		<date>2008-12-01</date>
    		<bla>blafasel</bla>
    	</bwz>
    	<bwz>
    		<date>2009-01-05</date>
    		<bla>jüngstes</bla>
    	</bwz>
    	<bwz>
    		<date>2007-06-05</date>
    		<bla>bluber</bla>
    	</bwz>
    	<bwz>
    		<date>2006-07-05</date>
    		<bla>quatsch</bla>
    	</bwz>
    </bafoeg>
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:exsl="http://exslt.org/common"
      extension-element-prefixes="exsl"
    >
    	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    	
    	<xsl:variable name="youngestbwz">
          <xsl:for-each select="/descendant::bwz">
            <xsl:sort order="descending" select="substring(date,1,4)"/>
    			<!-- year sort -->
    			<xsl:sort order="descending" select="substring(date,6,2)"/>
    			<!-- month sort -->
    			<xsl:sort order="descending" select="substring(date,9,2)"/>
    			<!-- day sort -->
    			<xsl:if test="position()=1">
    				<xsl:value-of select="." />
    			</xsl:if>
              </xsl:for-each>
        </xsl:variable>
    
    	<xsl:template match="/">
    		<xsl:text>Variable :</xsl:text><xsl:value-of select="$youngestbwz" />
    		<xsl:text>Nodeset :</xsl:text><xsl:value-of select="exsl:node-set($youngestbwz)" />
    		<xsl:text>bla: </xsl:text><xsl:value-of select="exsl:node-set($youngestbwz)/bla"/><xsl:text> </xsl:text>
    		<xsl:text>date: </xsl:text><xsl:value-of select="exsl:node-set($youngestbwz)/date"/><xsl:text>  </xsl:text>
    	</xsl:template>
    	
    	
    </xsl:stylesheet>
    Ich verstehe nicht warum nach "bla:" und "date:" nichts ausgegeben wird.
    In den Artikel zu node-set steht, dass die Funktion ein Result Tree Fragment in ein node-set umwandelt und man mit einem XPath Ausdruck wie $Variable/bla auf Kind-Knoten zugreifen kann.
    In den Artikeln die ich mir bisher angeschaut habe wird aber meist mit (etwas weltfremden) Beispielen wie:

    Code:
    <xsl:variable name="author">
      <firstname>Jirka</firstname>
      <surname>Kosek</surname>
      <email>[email protected]</email>
    </xsl:variable>
    operiert. Was ist der Unterschied zu der Variablen die ich definiert habe? Liefert die kein Result Tree Fragment zurück?

    Vielen Dank für jeden Hinweis

  • #2
    copy-of benutzen damit Knotenname und Inhalte mit übergeben werden


    xml zum test


    Code:
    <?xml version="1.0"?>
    <bafoeg>
    	<bwz>
    		<date>2008-12-01</date>
    		<bla>blafasel</bla>
    	</bwz>
    	<bwz>
    		<date>2009-01-05</date>
    		<bla>jüngstes</bla>
    	</bwz>
    	<bwz>
    		<date>2007-06-05</date>
    		<bla>bluber</bla>
    	</bwz>
    	<bwz>
    		<date>2006-07-05</date>
    		<bla>quatsch</bla>
    	</bwz>
    </bafoeg>
    xsl
    Code:
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:math="http://exslt.org/math" xmlns:set="http://exslt.org/sets" extension-element-prefixes="exsl math set" version="1.0">
    	<xsl:output indent="yes" method="text"/>
    	<xsl:variable name="kn_nodeset">
    		<xsl:for-each select="//bafoeg/bwz">
    			<xsl:sort order="descending" select="substring(date,1,4)"/>
    			<xsl:sort order="descending" select="substring(date,6,2)"/>
    			<xsl:sort order="descending" select="substring(date,9,2)"/>
    			<xsl:if test="position()=1">
    				<xsl:copy-of select="."/>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:variable>
    
    	<xsl:template match="/">
    
    
    		<xsl:text>Variable :</xsl:text>
    		<xsl:value-of select="$kn_nodeset"/>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>Nodeset :</xsl:text>
    		<xsl:value-of select="exsl:node-set($kn_nodeset)"/>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>bla  :</xsl:text>
    		<xsl:value-of select="exsl:node-set($kn_nodeset)/bwz/bla"/>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>date :</xsl:text>
    		<xsl:value-of select="exsl:node-set($kn_nodeset)/bwz/date"/>
    		<xsl:text>&#xA;</xsl:text>
    
    
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>ohne exslt</xsl:text>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>&#xA;</xsl:text>
    
    		<xsl:text>bla  :</xsl:text>
    		<xsl:value-of select="$kn_nodeset/bwz/bla"/>
    		<xsl:text>&#xA;</xsl:text>
    		<xsl:text>date :</xsl:text>
    		<xsl:value-of select="$kn_nodeset/bwz/date"/>
    		<xsl:text>&#xA;</xsl:text>
    	</xsl:template>
    </xsl:stylesheet>
    ergebnis
    Code:
    Variable :
    		2009-01-05
    		jüngstes
    	
    Nodeset :
    		2009-01-05
    		jüngstes
    	
    bla  :jüngstes
    date :2009-01-05
    
    ohne exslt
    
    
    
    bla  :jüngstes
    date :2009-01-05
    getestet mit saxon 6.5 und saxon 8.7

    Comment

    Working...
    X