Xsl-t

elkassi

Mitglied
Hallöli,

habe ein paar Fragen zu XSL-Transformationen:
1. Wie kann ich bei einer Transformation innerhalb meines Stylesheets eine externe Datei (kein XSL-Stylesheet!) "einbetten", d.h. Inhalt lesen und so wie er ist ausgeben?

2. Kann man irgendwie Abfragen (während einer Transformation), ob eine bestimmte Regel/ein bestimmtes Template existiert?
Also zb:
Code:
<xsl:if test=" ex. ein Template der form <xsl:template match="xy" mode="z">  ">
  <xsl:apply-templates select="xy" mode="z"/>
</xsl:if>
Problem ist: wenn ich es einfach aufrufe und es nicht existiert, wird eine Standardregel angewendet, die den Inhalt aller Knoten einfach so ausgibt. Das will ich nicht. In diesem Fall brauche ich eine spezielle Behandlung/Formatierung oder eben keine Ausgabe.
Alternativ müsste ich für alle möglichen Knotentypen dort ein entsprechendes Template generieren und leer lassen. Da das aber unüberschaubar weil dynamisch ist, möchte ich das auch nicht.

Ich hoffe, mir kann jemand weiterhelfen.

Danke
Kassi
 

Cybernd

Mitglied
1.) mit folgendem Ausdruck:

<xsl:copy-of select="{document(andereDatei.xml)}"/>

Erweiterbar um
document(...)//rootknoten/etc...
Um nur Teilbäume rauszupicken

hth
cybi
 

elkassi

Mitglied
Danke, aber nicht ganz:

Die Funktion document() lädt ein XML-Dokument von...

Die Datei, die ich nachladen möchte, ist aber keine XML-Datei, sondern Text bzw. (hier konkret) ein HTML-Text, welcher während der Transformation einfach im Ergebnis eingefügt werden soll.

Das Laden mit copy-of liefert demnach den Fehler "Angeforderte Dokumentation kann nicht geladen werden... etc." weil nicht XML-konform. :(

Dazu kommt, dass der Name der Datei, welche nachgeladen werden soll, als Attribut im aktuell zu transformierenden Element steht.
Ok, hab ich ausprobiert mit
Code:
<xsl:copy-of select="document(concat('/base-path/to/file',@quelle))"/>
Zusammensetzen des Namens geht, aber der Inhalt wird halt nicht übernommen.

Ach ja.. die geschweiften Klammern:
select="{document(...)}"
führt zu: "Invalid character ({) in expression... Ich hab auch nirgends etwas über diese Notation gefunden.

Habt Dank für jeden weiteren Hinweis
Kassi
 
Zuletzt bearbeitet:

Cybernd

Mitglied
Die geschweiften Klammern waren mein Fehler.

Sie sind die Kurznotation für XPath Anweisungen. Da select aber von einer XPath ausgeht benötigt man sie in diesem Konstrukt nicht.

<htm att="{xpath}"> würde einem
<htm><xsl:attribute select="xpath"/></html>
entsprechen ;o)

Tja wenn du kein XML vorliegen hast, dann ist es deine Aufgabe dafür zu sorgen eines zu bekommen, denn XSL ist nunmal für XML =xsl> XML gedacht.

cybi
 

elkassi

Mitglied
Danke nochmal,
hab aus allen möglichen statischen Seiten eine mini-xml-Seite gemacht, die ich dann per value-of einlade.
Das funktioniert.

Aber: erklär mir bitte nochmal das mit den geschweiften Klammern.
Irgendwie will das mein Übersetzer nicht. Ich benutze xalan 1.3, aber mit dem integrierten Xalan oder Saxon vom Oxygen-Editor gehts auch nicht. Diese sind: Xalan Java 2.5.1 und Saxon 6.5.3

Folgendes Konstrukt, pfad wird korrekt übergeben, keine der includes tut:
Code:
<xsl:param name="pfad"/>
<xsl:include href="file://{$pfad}/dir/file.xsl"/>
<xsl:include href="{$pfad}/dir/file.xsl"/>

Meldung: Pfad enthält ungültiges Zeichen: {

Wo kann ich denn diese Notation nutzen und:
Wie kann ich mein include-Statement so hinbiegen, dass er den Basispfad aus dem Parameter benutzt.

Anmerkung: theoretisch liegen die einzubindenden xsl's relativ zu dem Dokument, welches sie einbindet, aber wenn ich nur href="../dir/file.xsl" verwende, so kennt die Xalan-Schnittstelle das nicht und meldet:

Fatal Error at (file <unknown>, line 7, column 57): An exception occured! Type:XMLPlatformException, Message:Could not determine base pathname of the file

Rat?
Dank
Kassi
 

Cybernd

Mitglied
Problem include:

Bist du dir sicher das ../dir/file.xsl korrekt ist? Normalerweise sollte der Pfad relativ zur eigentlichen XSL sein. Ein derartiger Fehler deutet normalerweise auf einen Fehler des Pfades.

Zur {

Bei deiner Fehlermessage bin ich fast der Meinung das der Fehler an einer anderen Stelle stattfindet.

Er schreibt ja pfad enthält ungültiges Zeichen (Sollte der nicht kleingeschrieben aufgetaucht sein?)

Wenn dieser Pfad ein ungültiges Zeichen enthält, dann wird der Fehler an einer anderen Stelle verursacht. Denn in dem Falle müsste es heißen Attribut href enthält ungültiges Zeichen.

hth
cybi
 

elkassi

Mitglied
Jo, also:
der Pfad ist korrekt und wenn ich Ersetzungen aus Oxygen heraus mache (auch dort mittels integriertem Xalan), funktioniert es auch.
Mein Perl-Skript, welches XML::Xalan::Transformer benutzt scheint damit jedoch Probleme zu haben: er sagt ja: Could not determine base pathname of the file, d.h. er weiß scheinbar nicht, so die XSL-Datei liegt (die ich ihm gebe!).

[pause, nachschau]

Ja! Ja!... Danke Manchmal muss man nur Tippen, was man macht:

Ich gebe dem Transformer natürlich den INHALT und nicht den Pfad zur Datei, woher soll er dann auch wissen, wo diese liegt.
Also: Gebe ich den Pfadnamen, funktioniet alles!

Ok, zu Problem2: Keine Ahnung.
Es scheinen keine { innerhalb von xsl:include href="..." erlaubt zu sein.
Wie bereits beschrieben, hab ich auch nirgends etwas über diese Art der Notation gefunden.
Kannst du da Quellen nennen?

Danke
Kassi
 

Neue Beiträge