Announcement

Collapse
No announcement yet.

einfache Frage zu eingebauten Templates

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

  • einfache Frage zu eingebauten Templates

    Hallo allerseits,
    Warum werden die Attribute der folgenden einfachen XML-Datei nicht ausgegeben?
    Weil ein Attributsknoten kein Kindknoten ist.
    (Er gehört zwar zu einem Elementknoten, ist aber kein Kindsknoten).
    So weit so gut.
    Aber welchen Sinn hat dann überhaupt das eingebaute Template, das
    für die Attribute zuständig ist?
    Wie kann ich dieses eingebaute Template (in meinem Beispiel unten) überhaupt verwenden?

    mfg
    carlox



    Code:
    XML-Datei
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="c.xsl" ?>
    <personen>
       <person>
          <namen>
             <vorname nickname="Harry">Armin</vorname>
             <nachname>Arm</nachname>
          </namen>
          <adressse>Looserweg</adressse>
       </person>
    </personen>

    Code:
    XSL-Datei
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns="http://www.w3.org/TR/REC-html40">
      <xsl:output method="html" version="4.0" indent="yes" encoding="ISO-8859-1"/>
    
    </xsl:stylesheet>

  • #2
    Es ist richtig, dass es ein eingebautes Template
    Code:
    <xsl:template match="text()|@*">
      <xsl:value-of select="."/>
    </xsl:template>
    gibt, dass den Inhalt von Attributknoten als Textknoten in dem Resultatsbaum schreibt.
    Das eingebaute Template für Elementknoten ist aber
    Code:
    <xsl:template match="*|/">
      <xsl:apply-templates/>
    </xsl:template>
    d.h., hier werden nur die Kindsknoten, nicht aber die Attributknoten der Elementknoten zur weiteren Verarbeitung ausgewählt.
    Man könnte also ein Template
    Code:
    <xsl:template match="*">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:template>
    schreiben, dann werden die Attributsknoten auch verarbeitet, und, so kein weiteres Template für Attributknoten existiert, mit dem eingebauten Template.

    Comment


    • #3
      Danke für deinen Beitrag.
      Ich habe verstanden, was du schreibtst.
      Aber mir ist immer noch nicht klar, welchen Sinn das eingebaute Template (das für die Attribute zuständig ist) , wenn man es nicht nutzen kann.

      mfg
      carlox

      Comment


      • #4
        Sobald man für ein Element ein Template schreibt, dass auch Attribute per apply-templates verarbeitet, kann man das eingebaute Template für Attribute ja mit nutzen.
        So man sich nur auf die eingebauten Templates verlässt, werden Attribute nicht ausgegeben. Ansonsten können die eingebauten Templates nicht jeder Anwendung gerecht werden, in XSLT 3.0 (3.0 ist die Versionsnummer, die die finale Version haben soll, im Moment ist der Working Draft in Version 2.1 verfügbar) soll es deshalb mehrere Modi geben, um verschiedene Formen von eingebauten Templates nutzen zu können: http://www.w3.org/TR/xslt-21/#built-in-rule

        Comment


        • #5
          Originally posted by Martin Honnen View Post
          Es ist richtig, dass es ein eingebautes Template
          Code:
          <xsl:template match="text()|@*">
            <xsl:value-of select="."/>
          </xsl:template>
          gibt, dass den Inhalt von Attributknoten als Textknoten in dem Resultatsbaum schreibt.
          Das eingebaute Template für Elementknoten ist aber
          Code:
          <xsl:template match="*|/">
            <xsl:apply-templates/>
          </xsl:template>
          d.h., hier werden nur die Kindsknoten, nicht aber die Attributknoten der Elementknoten zur weiteren Verarbeitung ausgewählt.
          Man könnte also ein Template
          Code:
          <xsl:template match="*">
            <xsl:apply-templates select="@* | node()"/>
          </xsl:template>
          schreiben, dann werden die Attributsknoten auch verarbeitet, und, so kein weiteres Template für Attributknoten existiert, mit dem eingebauten Template.
          Waere es nicht besser, dies so auf das Root-Element auszudehnen:
          <xsl:template match="*|/">
          <xsl:apply-templates select="@* | node()"/>
          </xsl:template>

          mfg
          carlox

          Comment


          • #6
            "/" ist nicht das "root"-Element, sondern der "root"-Knoten (http://www.w3.org/TR/xpath/#root-node), also der Dokumentknoten selbst. Und der hat ohnehin keine Attribute.

            Comment

            Working...
            X