XSL if

rojhan

Grünschnabel
Hallo,

ich möchte im meinem XSL-Teil eine abfrage starten, sodass nur die erste zehn XML-Tags ausgegeben werden.

Meine Quellcode sieht wie folgt aus:

Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
		<title>IbS Bochum</title>
		<link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
	</head>
<body>
    <div id="col2news">
		<xsl:if test="position() &lt;= 10">
  			<xsl:apply-templates select="document('News.xml')//Nachricht">
				<xsl:sort select="Datum" order="descending" data-type="text" />
			</xsl:apply-templates>
		</xsl:if>
	</div>
</body>
</html>
</xsl:template>
	<xsl:template match="Titel">
		<h3><xsl:apply-templates/></h3>
	</xsl:template>
  	<xsl:template match="Text">
  		<p><xsl:apply-templates/></p>
	</xsl:template>
  	<xsl:template match="fett">
  		<b><xsl:apply-templates/></b>
	</xsl:template>
	<xsl:template match="Absatz">
		<br/><br/>
	</xsl:template>
	<xsl:template match="E-Mail">
  <a>
   <xsl:attribute name="href">
    <xsl:choose>
     <xsl:when test="contains(Url, '@')">
      <xsl:value-of select="concat('mailto:', Url)" />
     </xsl:when>
     <xsl:when test="starts-with(Url, 'www')">
      <xsl:value-of select="concat('http://', Url)" />
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="Url" />
     </xsl:otherwise>
    </xsl:choose>
   </xsl:attribute>
   <p><b>
    <xsl:value-of select="Url-Text" />
   </b></p>
  </a>
 </xsl:template>
<xsl:template match="Link">
  <a>
   <xsl:attribute name="href">
    <xsl:choose>
     <xsl:when test="contains(Url, '@')">
      <xsl:value-of select="concat('mailto:', Url)" />
     </xsl:when>
     <xsl:when test="starts-with(Url, 'www')">
      <xsl:value-of select="concat('http://', Url)" />
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="Url" />
     </xsl:otherwise>
    </xsl:choose>
   </xsl:attribute>
   <p><b>
    <xsl:value-of select="Url-Text" />
   </b></p>
  </a>
 </xsl:template>
	<xsl:template match="Datum">
		<p><xsl:apply-templates/></p><hr/>
	</xsl:template>
</xsl:stylesheet>

Bei mir klappt es leider nicht, alle Tags werden ausgegeben. Für eure Hilfe wäre ich euch sehr dankbar.

Gruß
 
Was willst du ausgeben, die ersten 10 Knoten, egal wie weit verschachtelt oder die ersten 10 Kindknoten?

Versuch es mal so
Code:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
		<title>IbS Bochum</title>
		<link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
	</head>
<body>
    <div id="col2news">
		
  			<xsl:apply-templates select="document('News.xml')//Nachricht[position() &lt;= 10]">
				<xsl:sort select="Datum" order="descending" data-type="text" />
			</xsl:apply-templates>

	</div>
</body>
</html>
</xsl:template>
	<xsl:template match="Titel">
		<h3><xsl:apply-templates/></h3>
	</xsl:template>
  	<xsl:template match="Text">
  		<p><xsl:apply-templates/></p>
	</xsl:template>
  	<xsl:template match="fett">
  		<b><xsl:apply-templates/></b>
	</xsl:template>
	<xsl:template match="Absatz">
		<br/><br/>
	</xsl:template>
	<xsl:template match="E-Mail">
  <a>
   <xsl:attribute name="href">
    <xsl:choose>
     <xsl:when test="contains(Url, '@')">
      <xsl:value-of select="concat('mailto:', Url)" />
     </xsl:when>
     <xsl:when test="starts-with(Url, 'www')">
      <xsl:value-of select="concat('http://', Url)" />
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="Url" />
     </xsl:otherwise>
    </xsl:choose>
   </xsl:attribute>
   <p><b>
    <xsl:value-of select="Url-Text" />
   </b></p>
  </a>
 </xsl:template>
<xsl:template match="Link">
  <a>
   <xsl:attribute name="href">
    <xsl:choose>
     <xsl:when test="contains(Url, '@')">
      <xsl:value-of select="concat('mailto:', Url)" />
     </xsl:when>
     <xsl:when test="starts-with(Url, 'www')">
      <xsl:value-of select="concat('http://', Url)" />
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="Url" />
     </xsl:otherwise>
    </xsl:choose>
   </xsl:attribute>
   <p><b>
    <xsl:value-of select="Url-Text" />
   </b></p>
  </a>
 </xsl:template>
	<xsl:template match="Datum">
		<p><xsl:apply-templates/></p><hr/>
	</xsl:template>
</xsl:stylesheet>
 
Vielen Dank, es klappt wunderbar.

ich möchte auch die Tags sortieren, Weißt du wie dieses geht? Ich habe wie folgt gemacht:

Code:
  	<xsl:apply-templates select="document('News.xml')//Nachricht[position() &lt;= 10]">
		<xsl:sort select="Datum" order="descending" data-type="text" />
	</xsl:apply-templates>

Aber es klappt leider nicht. Wie kann ich zuerst die Tags Sortieren und dann die erste zehn ausgeben? Ist es überhapt möglich?

Gruß
 
Könntest du mal eine Beispiel-XML-File posten? Schreib dann auch mal bitte was wonach sortiert werden soll.
 
Ungefähr so sieht meine XML-Dastei aus:

Code:
...
<Nachricht>
	<Titel>Titel</Titel>
	<Text>
		Text
		<Absatz/>
		Weitere Text
		<Fett>Fettes Text</Fett>
		Weitere Text
	</Text>
	<Link>
		<Url>www.tutorials.de</Url>
		<Url-Text>Tutorials</Url-Text>
	</Link>
	<E-Mail>
		<Url>rojhan@gmx.de</Url>
		<Url-Text>E-Mail an Rojhan</Url-Text>
	</E-Mail>
	<Datum>2007-04-10</Datum>
</Nachricht>
...

Ich möchte es nach Datum Sortieren und die erste zehn Tags aus geben.

Gruß
 
Also wenn ich richtig verstehe, möchtest du die ersten 10 Nachrichten ausgeben, oder?
 
Ja, aber davor sollen alle Tags sortiert werden und dann von der sortierten Tags die erste zehn ausgegeben werden.

Code:
<xsl:apply-templates select="document('News.xml')//Nachricht[position() &lt;= 4]">
	<xsl:sort select="Datum" order="descending" data-type="text" />
</xsl:apply-templates>

So werden nur die erste zehn Tags sortiert. Wenn es möglich ist, wäre es sehr hilfsreich. Sonst muss ich darauf achten, dass die Tags im XML-Datei sortiert sind.

Vielen Dank für deine Unterstützung.

Gruß
 
Da weiß ich leider nicht ob oder wenn wie es funktioniert. Aber eine Idee wäre wenn du dir noch eine XSLT-File schreibst die dir noch eine xml-Datei erstellt, in der die Nachrichten sortiert drin stehen, dann bräuchtest du nur noch die ersten 10 auszulesen.


MFG
zEriX
 
Hallo,

zuerst möchte ich mich für deine Unterstützung bedankeen.

Wie kann man mit XSL eine XML Datei erzeugen? Davon habe ich keine Ahnung :confused:

Grüße
Rojhan
 

Neue Beiträge

Zurück