XSLT-Newbie-Fragen

Hallo zusammen,

ich habe zwei XSLT-Newbie-Fragen, bei denen ich einfach nicht weiter komme und bei denen ihr mir hoffentlich helfen könnt!

1) Zum einen möchte ich gerne wissen, ob es möglich ist, mit Hilfe eines einzelnen XSL-Stylesheet mehrere Dateien zu erzeugen.
Ist es z.B. möglich aus einer Liste von Büchern für jedes Buch eine eigene HTML-Seite zu generieren? Mein Anwendungsfall ist etwas komplexer, aber ich hoffe, das Beispiel reicht zur Verdeutlichung des eigentlichen Problems ...

XML-Code
Code:
<list_of_books>
	<book>
		<author>Author Meier</author>
		<title>title 1</author>
		<isbn>123</isbn>
 	</book>
	<book>
		<author>Author Schmidt</author>
		<title>title 2</author>
		<isbn>456</isbn>
 	</book>
	<book>
		<author>Author Meier</author>
		<title>title 3</author>
		<isbn>789</isbn>
 	</book>
	...
</list_of_books>

2) Außerdem würde ich gerne eine Übersichtseite generieren, wo - bezogen aufs obige Beispiel - zunächst alle Bücher von Herrn Meier, dann die von Herrn Schmidt, etc. jeweils gemeinsam zusammen angezeigt werden.

Weil ich vorher nicht weiß, welche Autoren auftauchen werden, müsste man ja quasi den Inhalt des <author>-Elementes auswerten und irgendwie alle Elemente mit dem selben Inhalt zusammen fassen ... Geht so etwas?

Vielen Dank für jeden Hinweis und schöne Grüße,
Peter
 
Hi,

2) Außerdem würde ich gerne eine Übersichtseite generieren, wo - bezogen aufs obige Beispiel - zunächst alle Bücher von Herrn Meier, dann die von Herrn Schmidt, etc. jeweils gemeinsam zusammen angezeigt werden.

So auf die Schnelle:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="index.xslt"?>
<list_of_books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<book>
		<author>Author Meier</author>
		<title>title 1</title>
		<isbn>123</isbn>
 	</book>
	<book>
		<author>Author Schmidt</author>
		<title>title 2</title>
		<isbn>456</isbn>
 	</book>
	<book>
		<author>Author Meier</author>
		<title>title 3</title>
		<isbn>789</isbn>
 	</book>
</list_of_books>

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output version="1.0" method="html" encoding="ISO-8859-1" indent="yes"/>
	<xsl:template match="/">
		<html>
			<head>
				<title>Bücher</title>
			</head>
			<body>
				<h1>Bücher</h1>
				
				<xsl:for-each select="list_of_books/book">
					<xsl:sort select="author"/>
					<xsl:variable name="last_author" select="author"/>
					<xsl:if test="not(preceding-sibling::book[author=$last_author])">
						<h2><xsl:value-of select="author"/></h2>
						<ul>
							<xsl:for-each select="/list_of_books/book[author=$last_author]">
								<li>
									<xsl:value-of select="author"/><br/>
									<xsl:value-of select="title"/><br/>
									<xsl:value-of select="isbn"/>
								</li>
							</xsl:for-each>
						</ul>
					</xsl:if>
				</xsl:for-each>
				
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

Erzeugt:

Code:
<h1>Bücher</h1>
<h2>Author Meier</h2>
<ul>
  <li>Author Meier<br>
    title 1<br>
    123</li>
  <li>Author Meier<br>
    title 3<br>
    789</li>
</ul>
<h2>Author Schmidt</h2>
<ul>
  <li>Author Schmidt<br>
    title 2<br>
    456</li>
</ul>

Herzlichst
Dirk Einecke
 
Hallo zusammen,

wollte mich - mit etwas Verspätung - bei euch für die Hilfe bedanken!!

Dirk, dein Code-Beispiel konnte ich super übernehmen!
Auf das Konstrukt
<xsl:variable name="last_author" select="author"/>
<xsl:if test="not(preceding-sibling::book[author=$last_author])">
wäre ich glaube ich nicht gekommen. Wieder was gelernt: Einsatz von Variablen und der Funktion preceding-sibling. Danke!

Daniel, dein Hinweis auf xsl:result-document war auch gut. Habe dazu noch eine gute Einführung gefunden, die ich teilen will: http://www-128.ibm.com/developerworks/xml/library/x-tipmultxsl.html

Vg,
Peter
 
Hallo nochmal,

ich mache diesen Thread nochmal auf, weil noch eine zusätzliche Anforderung hinzugekommen ist, mit der ich trotz vielen Probierens leider nicht zurechtkomme - vielleicht kann jemand helfen?

Um bei meinem im ersten Posting unter 2) beschriebenen - vereinfachendem - Beispiel zu bleiben:

Die Bücher sollen nicht nur jeweils für einen Autor gemeinsam angezeigt werden, sondern zusätzlich auch noch jeweils alphabetisch sortiert werden.

Geht das mit dem von Dirk beschriebenen Ansatz oder muss man dann ganz anders vorgehen?

Ich stehe wirklich völlig auf dem Schlauch...

Vielen Dank für jede Hilfe,
Peter
 
Hallo,

also meines Wissens nach müsste deine Ausgabe nach Dirks xslt-files alphabetisch sortiert ausgegeben werden.


MFG
zEriX
 
Hi,
also meines Wissens nach müsste deine Ausgabe nach Dirks xslt-files alphabetisch sortiert ausgegeben werden.
hast du es ausprobiert?

Also, wenn ich das folgende XML-Fragment ...
Code:
<?xml version="1.0" encoding="UTF-8"?>
<list_of_books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<book>
		<author>Author Meier</author>
		<title>B-Titel</title>
		<isbn>123</isbn>
 	</book>
	<book>
		<author>Author Schmidt</author>
		<title>Titel XY</title>
		<isbn>456</isbn>
 	</book>
	<book>
		<author>Author Meier</author>
		<title>A-Titel</title>
		<isbn>789</isbn>
 	</book>
</list_of_books>
... mit folgendem Script laufen lasse (Saxon - XSLT 2.0) ...
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
			<head>
				<title>Buecher</title>
			</head>
			<body>
				<h1>Buecher</h1>
				
				<xsl:for-each select="list_of_books/book">
					<xsl:sort select="author"/>
					<xsl:variable name="last_author" select="author"/>
					<xsl:if test="not(preceding-sibling::book[author=$last_author])">
						<h2><xsl:value-of select="author"/></h2>
						<ul>
							<xsl:for-each select="/list_of_books/book[author=$last_author]">
								<li>
									<xsl:value-of select="author"/><br/>
									<xsl:value-of select="title"/><br/>
									<xsl:value-of select="isbn"/>
								</li>
							</xsl:for-each>
						</ul>
					</xsl:if>
				</xsl:for-each>
				
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
... dann erscheint bei mir unter Author Meier "B-Titel" vor "A-Titel". Bei dir nicht?

Gruß,
Peter
 
Ach du willst die Titel sortiert haben? Ich hab dich verstanden als möchtest du die Autoren sortiert haben.
Dann musst du dieses einfügen in der Schleife für die Autoren.

Code:
<xsl:sort select="title"/>

Hier also die komplette Datei
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
			<head>
				<title>Buecher</title>
			</head>
			<body>
				<h1>Buecher</h1>
				
				<xsl:for-each select="list_of_books/book">
					<xsl:sort select="author"/>
					<xsl:variable name="last_author" select="author"/>
					<xsl:if test="not(preceding-sibling::book[author=$last_author])">
						<h2><xsl:value-of select="author"/></h2>
						<ul>
							<xsl:for-each select="/list_of_books/book[author=$last_author]">
                                                                <xsl:sort select="title"/>
								<li>
									<xsl:value-of select="author"/><br/>
									<xsl:value-of select="title"/><br/>
									<xsl:value-of select="isbn"/>
								</li>
							</xsl:for-each>
						</ul>
					</xsl:if>
				</xsl:for-each>
				
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
 
Zuletzt bearbeitet:
Hi,
Ach du willst die Titel sortiert haben? Ich hab dich verstanden als möchtest du die Autoren sortiert haben.

Sorry, da habe ich mich wohl schlecht ausgedrückt!

Dann musst du dieses einfügen in der Schleife für die Autoren.

Code:
<xsl:sort select="title"/>
Aaah! So langsam verstehe ich das Prinzip!
Vielen Dank für die Hilfe gegen die lange Leitung und frohe Ostern,
Peter
 
Ich persönlich würde diese weise bevorzugen.

Code:
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:template match="/">
		<html>
			<head>
				<title>Buecher</title>
			</head>
			<body>
				<h1>Buecher</h1>
				<xsl:apply-templates />
			</body>
		</html>
	</xsl:template>
	
	
	<xsl:template match="list_of_books">
		
		<xsl:apply-templates>
			<xsl:sort select="author"/>
			<xsl:sort select="title"/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="book">
		<ul>
			<xsl:apply-templates />
		</ul>
	</xsl:template>
	
	
	<xsl:template match="book/*">
		<li>
			<xsl:value-of select="." />
		</li>
	</xsl:template>
	
	
	
</xsl:stylesheet>


MFG

zEriX
 
Zurück