Ignorieren bestimmter Elemente
Christian Kruse
- xsl
0 MatzeA0 MudGuard0 Thomas J.S.
Hallo alle,
ich habe leichte Probleme mit XSLT. Und zwar habe
ich eine Dokumentensprache gegeben, die XHTML
erweitert soll. Dazu soll ein XSLT-Script
geschrieben werden, dass die Dokumentensprache nach
XHTML uebersetzt, die XHTML-Elemente aber so laesst
wie sie sind. Ist das so moeglich mit XSLT? Mein
Cookbook laesst sich darueber leider nicht aus.
Gruesse,
CK
Hi,
auf die Gefahr hin, dass ich das Thema völlig falsch verstanden habe:
ich habe leichte Probleme mit XSLT. Und zwar habe
ich eine Dokumentensprache gegeben, die XHTML
erweitert soll. Dazu soll ein XSLT-Script
Ein XSLT Script kenne ich nicht. Ich kenne nur XSLT deklarationen bzw. Definitionen.
Mit diesen erzeugt dann Dein Parser das entprechende Dokument z.B: XHTML.
Da wäre ich schon bei der nächsten Frage: Welchen Parser verwendest Du? Oder hast Du einen eigenen geschrieben?
geschrieben werden, dass die Dokumentensprache nach
XHTML uebersetzt, die XHTML-Elemente aber so laesst
wie sie sind. Ist das so moeglich mit XSLT?
Ja sowas sollte schon gehen. Dafür ist ja unter anderem die XSL Definition gedacht. Es stellt sich nur die Frage, ob diese Richtig ist und Dein Parser das auch richtig "übersetzt".
Allerdings kenne ich keinen Parser, der XHTML Dokumente erzeugt.
Heisst nun nicht dass es sowas nicht gibt. Ich hab so einen nur noch nicht benötigt.
Gruss Matze
Hi,
ich habe leichte Probleme mit XSLT. Und zwar habe
ich eine Dokumentensprache gegeben, die XHTML
erweitert soll. Dazu soll ein XSLT-Script
geschrieben werden, dass die Dokumentensprache nach
XHTML uebersetzt, die XHTML-Elemente aber so laesst
wie sie sind. Ist das so moeglich mit XSLT? Mein
Cookbook laesst sich darueber leider nicht aus.
Diese XHTML-Elemente sollen also in den Ergebnisbaum kopiert werden?
Dann wäre xsl:copy-of wahrscheinlich das, was Du suchst.
cu,
Andreas
Hallo MudGuard,
Diese XHTML-Elemente sollen also in den
Ergebnisbaum kopiert werden?
Korrekt.
Dann wäre xsl:copy-of wahrscheinlich das, was
Du suchst.
Soweit war ich auch schon ;)
Aber dann muesste ich fuer jedes beschissene
XHTML-Element ein Template anlegen bzw. jedes
beschissene Element im match auffuehren. Und dazu
habe ich keine Lust...
Gruesse,
CK
Hallo Christian,
ich habe leichte Probleme mit XSLT. Und zwar habe
ich eine Dokumentensprache gegeben, die XHTML
erweitert soll. Dazu soll ein XSLT-Script
geschrieben werden, dass die Dokumentensprache nach
XHTML uebersetzt, die XHTML-Elemente aber so laesst
wie sie sind. Ist das so moeglich mit XSLT? Mein
Cookbook laesst sich darueber leider nicht aus.
Jein.
Was meinst du mit Erweiterung?
a) Es existiert ein Dokument mit XHTML-Syntax und XHTML-Elementen und nun soll _in_ dieses Dokument etwas eingefügt werden?
In diesem Fall: besser du vergisst es. Nein, es wäre nicht unmöglich, aber der Afwand dazu ist sehr groß: du müsstes dieses Dokument in einer XSLT-Sheet "einlesen" (document()) und analysieren. Wenn du eindeutige IDs etc hast, kannst du etwas leicher die Erweiterungen einfügen, aber wenn nicht, müsstest du für sämtliche XHTML-Elemente und Kombinationen vorkehrungen treffen.
b) Du erstellst einen XSLT-Sheet in dem das ganze XHTML Kram drinn steht wie gegeben, dann machst du an den gewünschten Stellen die notwenigen Erweiterungen.
Alles was in einem XSLT-Sheet vorkommt und nicht zum Namensraum vom XSL(T) gehört, wird als 'literal result element' gehandelt und in das Ergebnisdokument geschrieben.
Grüße
Thomas
Hallo Thomas,
Was meinst du mit Erweiterung?
a) Es existiert ein Dokument mit XHTML-Syntax
und XHTML-Elementen und nun soll _in_ dieses
Dokument etwas eingefügt werden?
Nein. Es existiert ein XML-Dokument, dass aus
XHTML-Elementen und eigenen Elementen besteht. Es
importiert also bestimmte Teile des
XHTML-Namensraums. Aber gleichzeitig existieren
auch eigene Elemente in diesem Dokument. Nun soll
dieses XML-Dokument komplett nach XHTML
transformiert werden: die schon bestehenden
XHTML-Elemente sollen weiter drin bleiben, die
eigenen XML-Teile sollen in XHTML uebersetzt
werden. Beispiel (rein fiktiv):
<doc>
<a href="blahr">Link</a> nach irgendwo
</doc>
<doc> soll umgesetzt werden nach XHTML, <a> soll
jedoch unveraendert uebernommen werden. Und fuer
dieses Problem suche ich nun eine generische
Loesung, ich moechte also eine Loesung fuer alle
XHTML-Elemente, ohne dass ich fuer jedes einzelne
ein xsl:template schreiben muss oder es im
<xsl:template match=""> auffuehren muss. Ich
moechte also quasi eine Art Default-Regel
definieren, die immer dann in Kraft tritt, wenn
kein passendes Template fuer ein Element gefunden
wurde.
Gruesse,
CK
Hi,
Ich
moechte also quasi eine Art Default-Regel
definieren, die immer dann in Kraft tritt, wenn
kein passendes Template fuer ein Element gefunden
wurde.
Dann mach das doch:
<xsl:template match="*">
<!-- was auch immer, z.B. xsl:copy-of -->
</xsl:template>
cu,
Andreas
Hallo MudGuard,
Dann mach das doch:
<xsl:template match="*">
<!-- was auch immer, z.B. xsl:copy-of -->
</xsl:template>
Hab ich schon versucht. Ergebnis: die anderen
Templates matchen nicht mehr:
ckruse@sunshine:~/dev/projects/ruby/tedit $ cat test.xml
<?xml version="1.0" encoding="ISO-8859-15"?>
<doc>
<blub/>
</doc>
ckruse@sunshine:~/dev/projects/ruby/tedit $ cat test.xslt
<?xml version="1.0" encoding="ISO-8859-15"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="blub"><blahr/></xsl:template>
<xsl:template match="*"><xsl:copy-of select="."/></xsl:template>
</xsl:stylesheet>
ckruse@sunshine:~/dev/projects/ruby/tedit $ xsltproc test.xslt test.xml
<?xml version="1.0"?>
<doc>
<blub/>
</doc>
ckruse@sunshine:~/dev/projects/ruby/tedit $
Gruesse,
CK
Hallo Christian,
Es existiert ein XML-Dokument, dass aus
XHTML-Elementen und eigenen Elementen besteht. Es
importiert also bestimmte Teile des
XHTML-Namensraums. Aber gleichzeitig existieren
auch eigene Elemente in diesem Dokument. Nun soll
dieses XML-Dokument komplett nach XHTML
transformiert werden: die schon bestehenden
XHTML-Elemente sollen weiter drin bleiben, die
eigenen XML-Teile sollen in XHTML uebersetzt
werden. Beispiel (rein fiktiv):<doc>
<a href="blahr">Link</a> nach irgendwo
</doc><doc> soll umgesetzt werden nach XHTML, <a> soll
jedoch unveraendert uebernommen werden. Und fuer
dieses Problem suche ich nun eine generische
Loesung, ich moechte also eine Loesung fuer alle
XHTML-Elemente, ohne dass ich fuer jedes einzelne
ein xsl:template schreiben muss oder es im
<xsl:template match=""> auffuehren muss. Ich
moechte also quasi eine Art Default-Regel
definieren, die immer dann in Kraft tritt, wenn
kein passendes Template fuer ein Element gefunden
wurde.
Ich kann dir dazu jetzt nur einen Ansatz geben, aber damit wirst du schon weiterkommen:
<xsl:template name="html">
<xsl:param name="knoten" />
<xsl:copy-of select="$knoten" />
</xsl:template>
<xsl:call-template name="html">
<xsl:with-param name="knoten" select=".//*[not(name() = document('')//xsl:template/@match)]" />
</xsl:call-template>
Das kannst du für Elemente machen die nicht XHTML-Elemente sind:
<xsl:template match="doc">
<div>
<xsl:call-template name="html">
<xsl:with-param name="knoten" select=".//*[not(name() = document('')//xsl:template/@match)]" />
</xsl:call-template>
</div>
</xsl:template>
-----------
Warum call-template? Weil im Pattern von @match von xsl:template das document() Funktion nicht verwendet werden kann/darf.
Der Ausdruck .//*[not(name() = document('')//xsl:template/@match)]
selectiert _ab_ dem Kontextknoten alle Elemente dessen Name nicht in einem match Attribut in einem xsl:template vorkommt.
Ein andere Möglichkeit wäre es mit key() was zu machen. hier nur als ungetestete Bsp:
<xsl:key name="html" match="//*[not(name() = document('')//xsl:template/@match)]" use="." />
<xsl:template match="*[name() = key('html', .)]">
<xsl:copy-of select="." />
</xsl:template>
Hoffe du kommst damit weiter.
Grüße
Thomas