xsl transform to html

daniel665

Grünschnabel
Hallo
ich habe hier ein xml Dokument und ein xsl Dokument.
Das xsl Dokument macht in Zeile 12 Probleme. select="substring-after($ntext,``)"/> wenn icch die zwei einfachen Anführungszeichen nach dem Komma in der Klammer weglasse (das komma auch) dann ist das Dokument gültig läßt sich aber nicht transformieren.
Wo liegt hier der Fehler?

MfG
Daniel


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "docbookx.dtd">
<?xml-stylesheet type="text/xsl" href="docbook.xsl"?>
<!--Dies ist ein DocBook-Dokument-->
<book lang="de">
<title>Ein sehr einfaches Buch</title>
<chapter>
<title>Einführung DocBook</title>
<para>So ist das also</para>
<figure>
<title>An Example Node Tree</title>
<graphic fileref="figures/node-tree.png"/>
</figure>
</chapter>
</book>


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:eek:utput method="html"/>

<xsl:template name="WasTueIch">
<xsl:param name="text"/>
<xsl:variable name="ntext" select="normalize-space($text)"/>
<xsl:choose>
<xsl:when test="$ntext">
<xsl:variable name="remainder">
<xsl:call-template name="WasTueIch">
<xsl:with-param name="text" select="substring-after($ntext,``)"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$remainder + 1"/>
</xsl:when>
<xsl:eek:therwise>0</xsl:eek:therwise>
</xsl:choose>
</xsl:template>

<xsl:template match="/">
<html>
<head>
<title>WasTueIch</title>
</head>
<body>
<xsl:for-each select="//*">
<xsl:variable name="length">
<xsl:call-template name="WasTueIch">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="name()"/>
<xsl:text>: </xsl:text>
<xsl:value-of select="$length"/>
<br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
 
Hallo,
was soll das werden? Eine Transformation in ein HTML-Dokument?
Das würde ich beispielsweise so machen:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8" />

<xsl:template match="/">
    <html>
        <head>
            <title>WasTueIch</title>
        </head>
        <body>
            <xsl:apply-templates />
        </body>
    </html>
</xsl:template>

<xsl:template match="book/title">
    <h1><xsl:value-of select="." /></h1>
</xsl:template>

<xsl:template match="chapter">
    <div style="font-family:sans-serif;">
        <xsl:apply-templates />
    </div>
</xsl:template>

<xsl:template match="title">
    <h2><xsl:value-of select="." /></h2>
</xsl:template>

<xsl:template match="para">
    <p><xsl:value-of select="." /></p>
</xsl:template>

<xsl:template match="figure">
    <dl>
        <dt style="margin-left:1em;padding-left:0;"><xsl:apply-templates select="graphic" /></dt>
        <dd style="margin-left:0;padding-left:0;font-size:0.81em;"><xsl:value-of select="title" /></dd>
    </dl>
</xsl:template>

<xsl:template match="graphic">
    <xsl:element name="img">
        <xsl:attribute name="src"><xsl:value-of select="@fileref" /></xsl:attribute>
        <xsl:attribute name="alt"><xsl:text>Abbildung</xsl:text></xsl:attribute>
        <xsl:attribute name="title"><xsl:value-of select="../title" /></xsl:attribute>
        <xsl:attribute name="style"><xsl:text>background-color:#ccc;border:1px solid #999;</xsl:text></xsl:attribute>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>
 
Danke erstmal

aber das xsl Dokument müßte so wie es ist funktionieren kann sich nur um kleine Fehler handeln.
nachdem der Fehler in Zeile 12 behoben kommt als nächster Fehler.
Fehlermeldung ist Stapelüberlauf?
Was bedeutet das?
 
Also ich teile Helas Ansicht.

Aber so läuft Dein Programm:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="html"/>
	<xsl:template name="WasTueIch">
		<xsl:param  name="text"/>
		<xsl:variable name="ntext" select="normalize-space($text)"/>
		<xsl:choose>
			<xsl:when test="$ntext">
				<xsl:variable name="remainder">
					<xsl:call-template name="WasTueIch">
						<xsl:with-param name="text" select="substring-after($ntext,' ')"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:value-of select="$remainder + 1"/>
			</xsl:when>
			<xsl:otherwise>0</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
	<xsl:template match="/">
		<html>
			<head>
				<title>WasTueIch</title>
			</head>
			<body>
				<xsl:for-each select="//*">
					<xsl:variable name="length">
						<xsl:call-template name="WasTueIch">
							<xsl:with-param name="text" select="."/>
						</xsl:call-template>
					</xsl:variable>
					<xsl:value-of select="name()"/>
					<xsl:text>: </xsl:text>
					<xsl:value-of select="$length"/>
					<br/>
				</xsl:for-each>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

Stapelüberlauf bedeutet, dass Deine Rekursion nicht aufhört. Du steigst so lange ab, bis der Stapelspeicher voll ist.

Gruss

limago
 
Zuletzt bearbeitet von einem Moderator:
Zurück