Christian Kruse: Ignorieren bestimmter Elemente

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

--
Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
  1. 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

  2. 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

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. 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

      --
      Nur die Weisesten und die Dümmsten können sich nicht ändern.
  3. 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

    1. 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

      --
      Descartes sagte: 'Ich denke, also bin ich.' Ich hingegen sage: 'Ich denke nicht, also bin ich.'
      1. 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

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
        1. 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

          --
          Der Mund ist das Portal zum Unglück.
      2. 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