Nikitaras: XSLT

hallo, ich versuche diese XML-datei via XSLT umzuformatieren:

<?xml version="1.0"?>
<?xml-stylesheet href="collection.xsl" type="text/xsl"?>

<collection>
	<movie>
		<title>Happy Gilmore</title>
		<year>1996</year>
		<genre>Comedy</genre>
	</movie>
	<movie>
		<title>Rango</title>
		<year>2011</year>
		<genre>Animated</genre>
	</movie>
	<movie>
		<title>Three Kings</title>
		<year>1999</year>
		<genre>Action</genre>
	</movie>
</collection>

mit diesem code funktioniert es einwandfrei:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
		
		<xsl:output method="html"/>
		
		<xsl:template match="collection">
			
			<html>
				<head>
					<title>Movie-Collection</title>
				</head>
				<body>
					<table border="1">
						<tr>
							<th>Title</th>
							<th>Genre</th>
							<th>Year</th>
						</tr>
						<xsl:apply-templates select="movie"/>
					</table>
				</body>
			</html>		
		</xsl:template>
		
		<xsl:template match="movie">
			<tr>
				<td><xsl:value-of select="title"/></td>
				<td><xsl:value-of select="year"/></td>
				<td><xsl:value-of select="genre"/></td>
			</tr>
		</xsl:template>
		
	</xsl:stylesheet>

jetzt würde ich allerdings den teil, in der die tabelle erstellt wird, auch gerne in ein eigenes template auslagern und habe mir dazu gedacht es sollte mit folgendem code klappen, das tut es allerdings leider nicht:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
		
		<xsl:output method="html"/>
		
		<xsl:template match="/">
			
			<html>
				<head>
					<title>Movie-Collection</title>
				</head>
				<body>
					<xsl:apply-templates/>
				</body>
			</html>		
		</xsl:template>

		<xsl:template match="collection">
			<table border="1">
				<tr>
					<th>Title</th>
					<th>Genre</th>
					<th>Year</th>
				</tr>
				<xsl:apply-templates select="movie"/>
			</table>
		<xsl:template/>
		
		<xsl:template match="movie">
			<tr>
				<td><xsl:value-of select="title"/></td>
				<td><xsl:value-of select="year"/></td>
				<td><xsl:value-of select="genre"/></td>
			</tr>
		</xsl:template>
		
	</xsl:stylesheet>

warum funktioniert das nicht, was soll ich hieran ändern?

vielen Dank!

Nikitaras

  1. sry leute, war nur ein dummer syntax-fehler in z. 29! trotzdem danke!

    aber ihr könnt mir auch gerne noch die vor- und nachteile des auslagerns erörtern. oder gründe nennen, warum ich vllt sogar lieber mit for-each, wie im folgenden dargestellt, durch die movies iterieren sollte bzw. warum das vllt sogar angebrachter wäre.

    <?xml version="1.0"?>
    
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    		
    	<xsl:output method="html"/>
    
    	<xsl:template match="/collection">
    	<html>
    	<head>
    		<title>Movie-Collection</title>
    	</head>
    	<body>
    		<table border="1">				
    			<tr>
    				<th>Title</th>
    				<th>Genre</th>
    				<th>Year</th>
    			</tr>
    			<xsl:for-each select="movie">
    			<tr>
    				<td><xsl:value-of select="title"/></td>
    				<td><xsl:value-of select="genre"/></td>
    				<td><xsl:value-of select="year"/></td>
    			</tr>
    			</xsl:for-each>
    		</table>
    	</body>
    	</html>
    	</xsl:template>
    </xsl:stylesheet>
    
    

    Nikitaras

    1. Hallo Nikitaras,

      aber ihr könnt mir auch gerne noch die vor- und nachteile des auslagerns erörtern. oder gründe nennen, warum ich vllt sogar lieber mit for-each, wie im folgenden dargestellt, durch die movies iterieren sollte bzw. warum das vllt sogar angebrachter wäre.

      Bei solchen kleinen Übungen liegt die Nutzung von xsl:for-each nahe. Komplexere Strukturen sollten jedoch mit mehreren Templates verarbeitet werden.

      Ich verwende xsl:for-each vorwiegend bei flachen Strukturen, wenn z. B. eine Auflistung der Form liste(eintrag+) vorliegt und quasi 1:1 in ol/ul > li verarbeitet werden soll. Ansonsten lassen sich mit XSLT 2.0 Abzählvorgänge praktikabel ohne aufwändigere Nutzung von xsl:call-template umsetzen:

      <xsl:for-each select="1 to 5">
        <img src="stern.gif" alt="" />
      </xsl:for-each>
      

      Meistens ist ein Mix der verfügbaren Techniken sinnvoll, sofern der Code modular und verständlich genug bleibt. Als Beispiel sei eine etwas komplexere EPUB-Transformation genannt. Dort kommt xsl:for-each auch mal beim Ausgeben von einfachen HTML-Tabellen zum Einsatz. Dafür weitere Templates einzusetzen, hätte kaum einen Mehrwert.

      Grüße,
      Thomas

      1. auch diesmal wieder vielen dank für die umfassenden informationen!

        Nikitaras