xml,xsl: Verschachtelte Elemente - was mache ich falsch?

  • #1
D

DamonWilder

Mitglied
Themenersteller
Dabei seit
20.07.2005
Beiträge
10
Reaktionspunkte
0
Ich möchte eine XML-Datei mittels XSLT ins Internet stellen. Innerhalb des Textes tauchen Namen auf, die in einer externen php-Datei gespeichert werden. Die Namen in der XML-Datei sollen mit den Namen in der externen php-Datei verlinkt werden. In meiner XML-Datei sieht das folgendermaßen aus:

Code:
<p>
Die blendende Antithese des <name n =Simonides> griechischen Voltaire</name>,
daß die Mahlerey eine stumme Poesie, und die Poesie eine redende Mahlerey sey, stand wohl in keinem Lehrbuche. Es war ein Einfall, wie <name n = Simonides>Simonides</name> mehrere hatte; dessen wahrer Theil so einleuchtend ist, daß man das Unbestimmte und Falsche, welches er mit sich führet, übersehen zu müssen glaubet.</p>
Da der wirkliche Name nicht zwangsläufig mit dem Namen zwischen dem name-Tag identisch ist, habe ich mittels n-Attribut einen eindeutigen Identifier hinzugefügt.
Auf der html-Seite soll natürlich der Name zwischen dem name-Tag verlinkt sein. Meine entsprechende XSLT-Datei sieht in Auszügen so aus:
Code:
<!-- Vorlage für Element p -->
<xsl:template match=p>
<xsl:value-of select=./>
<xsl:apply-templates select=name/>
<br />
</xsl:template>

<!-- Vorlage für Element name und Weitergabe des Namen an eine php-Datei,
zur Weiterverarbeitung in einer Datenbank -->
<xsl:template match=name>
<i>
<a href=../php/personenregister.php?name={@n}>
<xsl:value-of select=./>
</a>
</i>
</xsl:template>
Der Text besteht aus mehreren <p>-Elementen hintereinander. Wenn ich die XML-Datei im Browser aufrufe, dann wird der Name innerhalb des Textes ganz normal (d.h. nicht kursiv und nicht verlinkt) dargestellt und am Ende des jeweiligen Absatzes (d.i. <p>) erscheint nun nochmals der Name mit Verlinkung.

Was mache ich falsch?

* Conny: Code-Tags eingefügt *
 
  • #2
Gib mal einen Link auf die Webseite und poste wenn möglich bitte mal den KOMPLETTEN Sourcecode. Ich verstehe momentan nämlich nur Bahnhof! ;)
 
  • #3
Hallo Gandalf.

Der Link auf die entsprechende Seite ist:
http://www.lessing-akademie.de/tei/laokoon.xml

Leider funktioniert die Seite nur mit dem IE, den Quellcode der XML-Datei kann man sich dann ja anzeigen lassen.

Der vollständige Quellcode für die XSLT-Datei sieht momentan so aus:
Code:
<?xml version=1.0 encoding=ISO-8859-1?>
<xsl:stylesheet version=1.0 xmlns:xsl=[url]http://www.w3.org/1999/XSL/Transform>[/url]
<xsl:output method=html media-type=text/html indent=yes encoding=ISO-8859-1 omit-xml-declaration=yes doctype-public=-//W3C//DTD HTML 4.0 Transitional//EN /> 
	<xsl:template match=/text>
		<html>
			<head>
				<title>
<!-- Übergabe der Attributwerte der Elemente div1, div 2 und div3 in die Titelleiste des Browsers -->
					<xsl:apply-templates select=div1/>
				</title>
			</head>
			<body>
				<table align = center width = 80% border = 0>
					<tr>
						<td>				
  			<xsl:apply-templates select=div1/div2/div3/div4/>
						</td>
					</tr>
				</table>
			</body>
		</html>
	</xsl:template>

<!-- Vorlage für Element div1 -->
	<xsl:template match=div1>
		<xsl:value-of select=@n/>
		<xsl:apply-templates select=div2/>
		<xsl:apply-templates select=div2/div3/>
	</xsl:template>
	
<!-- Vorlage für Element div2 -->
	<xsl:template match=div2>
		<xsl:value-of select=@n/>
	</xsl:template>
	
<!-- Vorlage für Element div3 -->
	<xsl:template match=div3>
		<xsl:value-of select=@n/>
	</xsl:template>
	
<!-- Vorlage für Element div4 -->
	<xsl:template match=div4>
		<xsl:apply-templates select=head/>
		<xsl:apply-templates select=div5/>
		<xsl:apply-templates select=p/>
	</xsl:template>
	
<!-- Vorlage für Element head -->
	<xsl:template match=head>
		<h4 align = center>
			<xsl:value-of select=./>
		</h4>
	</xsl:template>
	
<!-- Vorlage für Element div5 -->
	<xsl:template match=div5>
		<h5>
			<xsl:value-of select=./>
		</h5>
	</xsl:template>
		
<!-- Vorlage für Element p -->
	<xsl:template match=p>
			<xsl:value-of select=./>
			<xsl:apply-templates select=q/>
			<xsl:apply-templates select=name/>
			<xsl:apply-templates select=pb/>
		<br />
	</xsl:template>

<!-- Vorlage für Element q -->
	<xsl:template match=q>
		<i>
			<xsl:value-of select=./>
		</i>
			<xsl:apply-templates select=name/>
			<xsl:apply-templates select=pb/>
	</xsl:template>	
	
<!-- Vorlage für Element name und Weitergabe des Namen an eine php-Datei, 
zur Weiterverarbeitung in einer Datenbank -->
	<xsl:template match=name>
		<i>
			<a href=../php/personenregister.php?name={@n}>
				<xsl:value-of select=./>
			</a>
		</i>
	</xsl:template>
	
<!-- Vorlage für Element pb -->
	<xsl:template match=pb>
		<p style = text-align:right>
			<xsl:text>[Seite </xsl:text>
			<xsl:value-of select=@n/>
			<xsl:text>]</xsl:text>
		</p>
	</xsl:template>
</xsl:stylesheet>

Danke im Voraus.

* Conny: Code-Tags eingefügt *
 
  • #4
Sorry, ich kann da René nur zustimmen => Bahnhof ;)

Auch wenn du nun einen Link zu der Seite hier gepostet hast, bitte wo/was ist eigentlich dein Problem ?? ??? ?? ;D
 
  • #5
Hmm, na dann versuche ich´s nochmal...

Auf der html-Seite sieht man mehrere Textabsätze, die zum Teil Namen enthalten. Diese Namen sollen verlinkt werden. Leider ist die Verlinkung aber nicht im Textblock, sondern am Ende jedes Absatzes. Deutlich sichtbar an den blauen Namen (der Link funtioniert noch nicht). Wenn Du jetzt in den Textabschnitt direkt über den jeweiligen Namen guckst, dann findest Du den Namen wieder. Hier sollte eigentlich der Link sein und nicht am Absatzende. Das ist mein Problem...

War das besser??
 
  • #6
  • #7
Jupp, jetzt versteh ich was du meinst.

Ich glaub ich weiß auch wo das Problem liegt. Wenn ich Zuhause bin, kümmere ich mich drum und vieleicht kann ich dir heute Abend (wenn ich wieder DSL habe) schon hier eine Lösung posten.

P.S. Deine XML ist ja mal gar nicht Strukturiert. Mir scheint es als ob du versuchst XML und HTML zu verschachteln. Warum greifst du übrigens auf HTML Tags in der XML zurück? Es ist doch sinniger selbst Tags zu deffinieren. Das ist doch gerade die Stärke von XML!!!
 
  • #8
Hallo Gandalf,

doch, doch, meine XML-Tags sind schon selbstdefinierte XML-Befehle. Die sind komplett der sogenannten TEI (Text Encoding Initiative) entnommen, die Richtlinien erstellt hat, nach denen man Texte beschreiben kann. Eigentlich gehen meine Tags auf eine prose.dtd zurück, die momentan aber noch nicht verlinkt ist... (das funktioniert noch nicht, wie so vieles :)
 
  • #9
Sorry, aber die DTD will ich mal sehen. die sieht nicht valide aus. Aber lassen wir das. Ich melde mich sobald ich Zeit gehabt habe mal näher drüber zu schauen
 
  • #10
Hi

Wenn du bei
Code:
 <xsl:template match=p>
<xsl:value-of select=./>
<xsl:apply-templates select=q/>
<xsl:apply-templates select=name/>
<xsl:apply-templates select=pb/>
<br />
</xsl:template>

das weglässt: <xsl:value-of select=./>
Dann sollten nur noch die Namen mit links drinstehen, allerdings fehlt halt der andere Text.
Ich hatte es damals aufgegeben HTML like XMLs mit XSLT in HTML darzustellen, weil man jeden Tag ein Template braucht.

Gruß, Michael
 
  • #11
Wie würdest Du denn die obige Seite programmieren? Vorausgesetzt, es handelt sich nicht um ein bisschen Text, sondern um mehrere tausend Seiten... Ich dachte, das wäre mit ausgelagerten Templates ganz gut gelöst?

Grüßend, Marcus
 
  • #12
Hi,

ich nähere mich der Lösung...

Ich habe die Codezeilen

Code:
<xsl:template match=p>
       <xsl:value-of select=./>
       <xsl:apply-templates select=q/>
       <xsl:apply-templates select=name/>
       <xsl:apply-templates select=pb/>
        <br />
      </xsl:template>

durch folgende ausgetauscht

Code:
<xsl:for-each select=p>
			<xsl:value-of select=./>
			<xsl:apply-templates select=q/>
			<xsl:apply-templates select=name/>
			<xsl:apply-templates select=pb/>
		<br/>
	</xsl:for-each>
, also offensichtlich eine Schleife eingebaut, was auch funktioniert. Jetzt werden die Namen innerhalb der Absätze korrekt verlinkt und nicht erst am Ende jedes Absatzes. Doch dummerweise wird jetzt meine <br/>-Anweisung ignoriert. Warum?
 
Thema:

xml,xsl: Verschachtelte Elemente - was mache ich falsch?

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.836
Beiträge
707.957
Mitglieder
51.489
Neuestes Mitglied
DonMartin
Oben