choose-Probleme

Cherrywine

Mitglied
Hej,

bei einigen kleineren Dingen komme ich mit meinem XSLT nicht weiter, trotz :google: :

In meiner *.xml möchte ich ein bestimmtes Div ansprechen, und zwar genau dann, wenn auf das <div> ein <page> folgt und nicht wie sonst ein <head>.
Leider führt meine when/otherwise-Anweisung zu nichts (bzw. die Anweisung aus dem Otherwise wird korrekt verarbeitet, nur die aus dem When nicht):
Code:
<xsl:template match="div">
	<xsl:choose>
		<xsl:when test="following-sibling::page[1] and not(following-sibling::head)">
			 <a href="http://hki.neontrauma.de/{image/@extref}" > Textbeginn(<xsl:value-of select="image/@nativeno"/>)</a>
			<xsl:apply-templates/>
		</xsl:when>
		<xsl:otherwise>
			<ul>
				<li>
					<xsl:apply-templates />
				</li>
			</ul>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>
Es soll an dieser Stelle eben das Wörtchen "Textbeginn" erscheinen.

Etwas unsicher bin ich mir, was die Zahl in eckigen Klammern zu bedeuten hat, darüber habe ich nichts finden können, und ob ich das <xsl:apply-templates /> nochmal angeben muss (hab's mit und ohne probiert, gleiches Ergebnis).


Zweites Problem:
ich möchte das letzte Element einer Art (<property>) ansprechen - auch hier funktioniert meine Anweisung leider nicht:
Code:
<xsl:template match="property">
	<br />
	<xsl:choose>
		<xsl:when test="position() = last()">
			<img src="buttons/kolophon.gif" alt="Kolophon" /> 
			<a href="http://hki.neontrauma.de/{../image/@extref}" seqno="{../image/@seqno}"> (<xsl:value-of select="../image/@nativeno"/>)</a>
		</xsl:when>
		<xsl:otherwise>
			<img src="buttons/handschrift.gif" alt="Handschriftliche Anmerkungen" /> 
			<a href="http://hki.neontrauma.de/{../image/@extref}" seqno="{../image/@seqno}"> (<xsl:value-of select="../image/@nativeno"/>)</a>
	          </xsl:otherwise>
        </xsl:choose>
</xsl:template>


Hat jemand von euch eine Idee?



Lieben Gruß
Cherrywine
 
Hi.
Etwas unsicher bin ich mir, was die Zahl in eckigen Klammern zu bedeuten hat, darüber habe ich nichts finden können
Die Klammer wählt von einer Knotenmenge ein bestimmtes Element aus. Da allerdings ein konkretes Element in XML maximal einen direkten Nachfahren hat, sind die Klammern in diesem Fall unnötig. Außerdem mußt du auch nicht doppelt prüfen: wenn der direkte Nachfolger ein "page" Element ist, kann es ja kein "head" Element sein, oder!?

Es reicht der Test "following-sibling::page"
und ob ich das <xsl:apply-templates /> nochmal angeben muss (hab's mit und ohne probiert, gleiches Ergebnis).
Das kann ich dir nicht sagen, das kommt drauf an ob du möchtest das die Elemente innerhalb des aktuellen Knotens auch durch die Templates verarbeitet werden.
Zweites Problem:
ich möchte das letzte Element einer Art (<property>) ansprechen - auch hier funktioniert meine Anweisung leider nicht:
Das kann ich nicht nachvollziehen. Was funktioniert denn nicht?

Gruß
 
Zuletzt bearbeitet:
Hej,

danke für deine Antwort. :)

Mit "nicht funktionieren" meine ich, dass sich keine Auswirkungen zeigen (bei beiden Problemen nicht).
Angucken kann man sich das hier - zum Einen soll eben an einer bestimmten Stelle das Wort "Textbeginn" eingefügt werden und zum anderen soll das allerletzte dieser Bildchen kein Tintenfass darstellen, sondern stattdessen auf die kolophon.gif zurückgreifen. Die *.xsl liegt hier.

Danke für die Erklärung mit dem Knoten, hab die Abfrage jetzt auch mal einfach geschrieben (in meiner Verzweiflung, warum's nicht funktioniert, bin ich dann irgendwann auf die zwei Bedingungen gekommen - naja, hätte ich mir sparen können ;) ).


Lieben Gruß
Cherrywine
 
Hi.

XML:
<a>
  <b>
    <c />
  </b>
  <d />
</a>
"sibling" bedeutet "Geschwisterteil". Der "next-sibling" des Elementes b ist d.

Du möchtest allerdings prüfen ob der erste Kindknoten von div ein page Element ist...

Code:
test="child::node()[1][name() = 'page']"

Das zweite Problem hängt wieder mit den Knotenmengen und dem Kontext des Knotens zusammen. Du nutzt die apply-templates Methode um die property Elemente zu verarbeiten. Die Funktion position() gibt nun die Position des Elementes innerhalb des aufrufenden Kontextes zurück.

Bsp:
XML:
<page>
	<image extref="gbv169+a_druck1=0001.jpg" seqno="008" nativeno="1" />
	<text type="keyword">Richter</text>
	<property>notes</property>
	<property>origin</property>
</page>
Wenn innerhalb dieses page Elementes der XSL Prozessor mit apply-templates die Kindelemente des page Elementes verarbeitet, werden alle Kindelemente zu einer Knotenmenge zusammengefaßt. D.h. in dem Beispiel wäre die position() des ersten property Elementes innerhalb des xsl:template dann 6, vom zweiten dann 8 (beim IE 3 und 4 da der IE einfach die Textknoten wegläßt).

Um festzustellen welches Element im gesamten Dokument das allerletzte property Element ist, kannst du z.B. so vorgehen:
Code:
test=". = (//property)[count(//property)]
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

dankeschön, das mit dem Bildchen klappt jetzt wunderbar. :)

So, jetzt muss ich nur noch das andere Problem gelöst bekommen, das mit dem Kindnoten. Wenn ich es so mache, wie du geschrieben hast, bringt das leider auch nichts (das When-Verhalten wird nicht angezeigt). :confused:

Code:
<xsl:template match="div">
	<xsl:choose>
		<xsl:when test="child::node()[1][name()='page']">
			<ul>
				<li>
					<a href="http://hki.neontrauma.de/{page/image/@extref}" > Textbeginn (<xsl:value-of select="page/image/@nativeno"/>)</a>
				</li>
			</ul>
		</xsl:when>
		<xsl:otherwise>
			<ul>
				<li>
					<xsl:apply-templates />
				</li>
			</ul>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>


Verwirrte Grüße
Cherrywine
 
Hi.
Code:
<xsl:template match="div">
	<xsl:choose>
		<xsl:when test="child::node()[1][name()='page']">
   ...
</xsl:template>
Ach, da hab ich mich vom Internet Explorer verwirren lassen. Der Test node() passt ja auf alle Knoten (auch Text-Knoten) die der IE aber fälschlicherweise gleich ganz wegläßt. So klappt es dann im IE und nicht in einem XSLT konformen Browser.

Probier's mal so:
Code:
test="child::*[1][name() = 'page']"
Gruß
 

Neue Beiträge

Zurück