Announcement

Collapse
No announcement yet.

TEI zu HTML: Template für Unterelement überall anwenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TEI zu HTML: Template für Unterelement überall anwenden

    Hallo zusammen!

    Ich bin blutiger XSLT-Anfänger, aber dachte, ich hätte die Basics begriffen. Aber anscheinend hab ich gar nichts begriffen.

    Ich habe ein selbsterstelltes TEI-Dokument, aus dem ich ein HTML-Dokument machen will. Bis jetzt klappt auch alles mehr oder weniger gut, aber ein Problem bekomm ich nicht gelöst: Ich will, dass jede Zahl (in TEI mit <num> markiert), egal wo sie steht, in Fett ausgegeben wird. Alles andere soll bleiben, wie es ist.
    Meine Idee war:
    <xsl:template match="//num">
    <b><xsl:value-of select="."/></b>
    </xsl:template>
    Das funktioniert aber nicht. Zumindest nicht, wenn mein <num>-Element z.B. in einem <app>-Element ist (das ein eigenes Template hat). Wie mach ich das? Das müsste doch lösbar sein, aber ich hab nichts hinbekommen. Ich hab auch mit for-each und apply-templates rumgespielt, aber nie klappt es so, wie ich es haben will: Alles wie bisher nur Zahlen in fett.

    Für Hinweise wäre ich dankbar.

  • #2
    In match-Attributen steht ein Pattern und da reicht
    Code:
    <xsl:template match="num">...</xsl:template>
    auf "//" am Anfang des Pattern kannst du verzichten.

    Ansonsten wird dein Template nur dann benutzt, wenn die "num"-Elemente per apply-templates zur Verarbeitung ausgewählt werden, so es also "app"-Elemente gibt, die "num" als Kindelement enthalten, dann muss das Template für "app" per apply-templates, also etwa
    Code:
    <xsl:template match="app">
    
       <xsl:apply-templates/>
    
    </xsl:template>
    sicherstellen, dass die Kindelemente auch verarbeitet werden. Das Template für "app" kann und wird vermutlich mehr machen, als nur das apply-templates, das ich oben gezeigt habe, aber ohne apply-templates (oder zumindes apply-templates select="num") werden die "num"-Element gar nicht verarbeitet.

    Comment


    • #3
      Danke für die Antwort!

      An sowas in die Richtung dachte ich auch.

      [Edit: Ich habe es für diesen Fall mittels apply-templates an der richtigen Stelle jetzt hinbekommen, wie ich es wollte, nachdem ich ein bisschen experimentiert hab.]

      Ich fände es extrem ineffizient, wenn ich überall dort, wo ein num-Element auftauche könnte, an die jeweiligen Stellen ein apply-templates zu setzen. Momentan ginge das noch, aber num bedeutet eben nur "Zahl" und Zahlen können im TEI-Dokument überall vorkommen. Das können Dutzende von Tags werden, die in XSLT wiederum nach unterschiedlichen Fällen anders behandelt werden. Da bräuchte ich ziemlich viel Code nur für die Behandlung des num-Elements.

      Gibt es nicht eine einfachere Möglichkeit zu definieren: "Überall da, wo ein num-Element auftaucht, mach im HTML ein <b> drumrum."? Dann müsste ich nicht überall ein apply-templates setzen.

      Wäre echt erleichtert, wenn mir da jemand einen einfachen Weg aufzeigen könnte!
      Zuletzt editiert von cis; 02.10.2012, 08:25.

      Comment


      • #4
        Ein Template mit match="num" ist ja der richtige Weg, um für alle "num"-Elemente festzulegen, wie sie transformiert werden sollen. Aber natürlich muss auch sichergestellt werden, dass die "num"-Elemente verarbeitet werden, und das erreicht man eben mit apply-templates. Es gibt auch eingebaute Templates http://www.w3.org/TR/xslt#built-in-rule, die per
        Code:
        <xsl:template match="*|/">
          <xsl:apply-templates/>
        </xsl:template>
        dafür sorgen, dass für Elemente, für die du kein Template schreibst, die Verarbeitung der Kindknoten erfolgt, aber sobald du für ein Element ein Template schreibst, musst du dafür sorgen, dass per apply-templates die Verarbeitung der Kindknoten weitergeht; sonst funktioniert der Prozess nicht. Mit XSLT 2.0 könnte man höchstens noch anstelle von apply-templates einfach next-match (http://www.w3.org/TR/xslt20/#element-next-match) nehmen, aber ganz ohne Anweisung in eigenen Templates wird die Verarbeitung von Kindknoten nicht durchgeführt.

        Comment

        Working...
        X