carsten schlichting: mit xpath in attribute mode schreiben | xml/xsl update datei

hallo

bin neueinsteiger in xsl und habe mir folgendes überlegt, das aber noch nicht so richtig funktionieren will:

habe gedacht dass es geschickt, ist eine große xsl datei anzulegen, die für alle möglichen xml-datei-varianten die xsl stylesheets enthält.

dann müßte diese eine xsl- datei, nur einmal vom Browser hochgeladen werden.??

wollte dann in der xml datei allen nodes ein attribute z.B. layout-name="z.B.start" mitgeben.

in der xsl datei sollte dann dieses attribut mit xpath in das attribute mode geschrieben werden, so dass dann für das passende layout die richtigen templates gewählt werden können.

aber leider funktioniert es nicht so wie ich es möchte.

mode="@layout-name" wird nicht verstanden.

--- 2. Thema

Und  .. gibt es eigentlich die möglichkeit xml/xsl datein im Browser upzudaten, anstatt alle daten nocheinmal neu zu senden?

gibt es sowas wie xml/xsl updatedateien?

liebe grüße

carsten

  1. hallo

    wollte dann in der xml datei dem root-node  ein attribute z.B. layout-name="z.B.start" mitgeben, das bestimmen soll, welche stylesheets mit hilfe von mode ausgewählt werden sollen

    in der xsl datei sollte dann dieses attribut mit xpath in das attribute mode geschrieben werden, so dass dann für das passende layout die richtigen templates gewählt werden können.

    aber leider funktioniert es nicht so wie ich es möchte.

    mode="@layout-name" wird nicht verstanden.

    folgendes hatte ich nun probiert, hat aber alles leider nicht geklappt:

    habe im stylesheet eine variable angelegt, die ihren wert aus dem xml dokument bezieht.

    aber mode="$layout-typ-z.B.1"

    funktioniert nicht.

    als fehlermeldung wird ausgegeben, dass kein $ in mode=" ..vorhanden sein darf??

    grüße carsten

    1. Hallo,

      wollte dann in der xml datei dem root-node  ein attribute z.B. layout-name="z.B.start" mitgeben,

      in der xsl datei sollte dann dieses attribut mit xpath in das attribute mode geschrieben werden

      aber leider funktioniert es nicht so wie ich es möchte.

      Kann es auch nicht weil ...

      mode="@layout-name" wird nicht verstanden.
      folgendes hatte ich nun probiert, hat aber alles leider nicht geklappt:

      habe im stylesheet eine variable angelegt, die ihren wert aus dem xml dokument bezieht.
      aber mode="$layout-typ-z.B.1"
      funktioniert nicht.
      als fehlermeldung wird ausgegeben, dass kein $ in mode=" ..vorhanden sein darf??

      ... weil im mode-Attribut ein nur ein "qname" d.h. eine qualifizierter XML-Name (http://www.w3.org/TR/xslt#qname) sein muss. D.h. ein Name den du einem Template gegeben hast. Es sind keine Variablen etc. erlaubt.

      Zudem möchte ich noch anmerken, dass eine einzige große XSL-Datei zu halten ist eher schlecht als recht, weil es irgendwann einfach unwartbar ist. Es ist besser bestimmte Funktionalitäten auf mehrere XSL-Dateien zu verteilen und dann diese Dateien in das "eigentliche" XSL zu inkludieren oder sie importieren.

      Grüße
      Thomas

      1. Hallo und danke für die infos

        ... weil im mode-Attribut ein nur ein "qname" d.h. eine qualifizierter XML-Name (http://www.w3.org/TR/xslt#qname) sein muss. D.h. ein Name den du einem Template gegeben hast. Es sind keine Variablen etc. erlaubt.

        schade -oder?

        wie könnte man den so ein Problem lösen.

        ?? wird eine xsl datei eigentlich immer wieder hochgeladen oder immer nur dieselbe benutzt??  ->
        Beim IE7 z. b. muß ich jedesmal das browserFenster schließen, um xsl-Veränderungen zu aktivieren...., dass spräche ja dafür, das xsl-dateien nur einmal geladen werden würden.

        Zudem möchte ich noch anmerken, dass eine einzige große XSL-Datei zu halten ist eher schlecht als recht, weil es irgendwann einfach unwartbar ist. Es ist besser bestimmte Funktionalitäten auf mehrere XSL-Dateien zu verteilen und dann diese Dateien in das "eigentliche" XSL zu inkludieren oder sie importieren.

        ich meine da einbißchen heraus zuhören, dass du aber trotzdem auch in deiner xslt datei viele stylesheets hast, die manchmal nicht benutzt werden.

        wie steuerst du gezielt die xslt templates an, die du gerade brauchst?

        grüße carsten

        1. hi

          ?? wird eine xsl datei eigentlich immer wieder hochgeladen oder immer nur dieselbe benutzt??  ->
          Beim IE7 z. b. muß ich jedesmal das browserFenster schließen, um xsl-Veränderungen zu aktivieren...., dass spräche ja dafür, das xsl-dateien nur einmal geladen werden würden.

          ich glaube, dass ich mich hier vertan habe.. nur wenn sich die xml datei nicht verändert wird das xsl-stylesheet nicht nocheinmal geladen, sonst denke ich schon.

          Zudem möchte ich noch anmerken, dass eine einzige große XSL-Datei zu halten ist eher schlecht als recht, weil es irgendwann einfach unwartbar ist. Es ist besser bestimmte Funktionalitäten auf mehrere XSL-Dateien zu verteilen und dann diese Dateien in das "eigentliche" XSL zu inkludieren oder sie importieren.

          ich meine da einbißchen heraus zuhören, dass du aber trotzdem auch in deiner xslt datei viele stylesheets hast, die manchmal nicht benutzt werden.

          wie steuerst du gezielt die xslt templates an, die du gerade brauchst?

          bin jetzt doch dazu übergegangen in php xml und xsl zu verbinden.

          das was ich oben vor hatte löse ich jetzt mit choose--when befehlen.

          habe jetzt z.B. ein template geschrieben, das speiziell text-nodes match't. im text node steht ein attribut, das bestimmt, welches xsl stylesheet in den einzelnen when-Bereichen angesprochen werden soll.
          dies attribut kann man ja gut in eine variable einlesen, die dann choose steuert

          so long

          carsten

        2. Hallo,

          ... weil im mode-Attribut ein nur ein "qname" d.h. eine qualifizierter XML-Name (http://www.w3.org/TR/xslt#qname) sein muss. D.h. ein Name den du einem Template gegeben hast. Es sind keine Variablen etc. erlaubt.

          schade -oder?

          Wie man's nimmt.
          Es zwingt einem zumindest besser seine Strukturen zu überlegen.

          wie könnte man den so ein Problem lösen.

          ?? wird eine xsl datei eigentlich immer wieder hochgeladen oder immer nur dieselbe benutzt??  ->

          Je nach XSLT-Prozessor.

          Beim IE7 z. b. muß ich jedesmal das browserFenster schließen, um xsl-Veränderungen zu aktivieren...., dass spräche ja dafür, das xsl-dateien nur einmal geladen werden würden.

          Das konnte ich noch nicht nachvollziehen.

          Zudem möchte ich noch anmerken, dass eine einzige große XSL-Datei zu halten ist eher schlecht als recht, weil es irgendwann einfach unwartbar ist. Es ist besser bestimmte Funktionalitäten auf mehrere XSL-Dateien zu verteilen und dann diese Dateien in das "eigentliche" XSL zu inkludieren oder sie importieren.

          ich meine da einbißchen heraus zuhören, dass du aber trotzdem auch in deiner xslt datei viele stylesheets hast, die manchmal nicht benutzt werden.

          Ja und nein.
          Ich habe auch XSL-Datei(en) die um die 3000 Zeilen sind, weil es in dem Fall nicht anderes ging.
          Normalerweise aber habe ich mehrere XSL-Dateien die verschiedene Funktionen erfüllen. So gab es in einem Projekt z.B. eine XSL-Datei in der nur globale Variablen und Templates enthalten sind, die in jedem anderen XSL gebraucht werden. Eine ander XSL ist nur für die Generierung von Navigationsmenüs zuständig, eine dritte enthählt nur Templates für Links, Bilder, Thumbnails, Flasch, eine weitere enthält nur Templates für News und eine andere generiert nur JavaScript usw.

          Viele der "eigentlichen" XSL-Dateien, d.h. die, die für das Erzeugen einer HTML-Seite zuständig sind, haben  nur 60 bis 200 Zeilen, dafür 10 bis 15 import-Anweisungen, je nach dem was gebraucht wird.

          Wollte ich hier alles in eine XSL-Datei schreiben, wären das über (pi mal daumen) 30-32 Tsd. Zeilen.

          Der Vorteil der starken Trennung von funktionalen Teilen von den eigentlich Layout-Teilen, war dann am deutlichsten zu sehen und zu fühlen, als das gesamte Webauftrifft ein koplett neues Layout bekam. Die XSLs mit den funktinalen Teilen mussten zu 90% überhaupt nicht angerührt werden (was bei insges. etwa 10 Tsd. Codezeilen eine enorme (Arbeits)Erleichterung war).

          ----

          Ich arbeite aktuell an den XSLs für SELFHTML 9, da besteht das XSL das eine normale Inhaltsseite generiert nicht mal aus 140 Zeilen und ich denke nicht, dass das viel mehr wird.

          wie steuerst du gezielt die xslt templates an, die du gerade brauchst?

          Mit modes oder mit Parameters und mit benannten Templates bzw. aus der Kombination aller drei Möglichkeiten.
          z.B.
          <xsl:template match="image[not(ancestor::link)]" name="standaloneimagetemplate">
          <xsl:template match="image[ancestor::link]" name="imagelinktemplate">
          <xsl:template match="image" mode="collection" name="standalonecollectionimage">
          <xsl:template match="painting[key('collectionpaintingkey', @id)]" mode="collection">
          <xsl:template match="image" mode="collectionthumbnail">
          <xsl:template match="painting" mode="collectionthumbnail">
          <xsl:template name="imagenavigation">

          Alle diese Templates behandeln eigentlich immer nur Bilder. Aber je nach dem wie und was ich davon brauchte wurden diese Templates mit den entsprechenden Parameter (entweder  mit dem Namen oder mit apply-templates) und/oder im entsprechenden Modus aufgerufen.

          Grüße
          Thomas