Paul Brunner: Element von der Transformation ausschliessen

Hallo zusammen,

XML-to-HTML-Transformation mit XSLT: Zwei verschiedene xsl-Dateien wahlweise angewendet auf eine xml-Datei sollen dazu verwendet werden unterschiedliche "Teilinhalte" des Dokumentes anzuzeigen.

Die Frage: Wie kann ich in einem Style-Sheet bestimmte Elemente explizit von der Transformation ausschließen?

Danke für die Hilfe
Paul

  1. Hi,

    Die Frage: Wie kann ich in einem Style-Sheet bestimmte Elemente explizit von der Transformation ausschließen?

    ich gebe zu; meine XSL-Kenntnisse beschränken sich auf die (rezipierende) Teilnahme an einer Einführung - aber genügt es nicht, solche Elemente nicht explizit einzuschließen?

    Cheatah

    1. Hallo,

      aber genügt es nicht, solche Elemente nicht explizit einzuschließen?

      Das dachte ich auch und meine mich auch dunkel erinnern zu können bei W3C sowas gelesen zu haben (habs leider nicht wieder gefunden).

      Mein XSLT-Prozessor (Sabotron 0.81) hat mich aber eines besseren belehrt. Inhalte von nicht definierten Elementen schreibt der einfach so in den Luftleeren Raum.

      Und Eigentlich möchte ich mir ersparen für jedes Element das ich nicht_sehen will ein leere Template-Definition zu schreiben, was natürlich auch einen Möglichkeit ist.

      Paul

      1. Hi,

        Mein XSLT-Prozessor (Sabotron 0.81) hat mich aber eines besseren belehrt. Inhalte von nicht definierten Elementen schreibt der einfach so in den Luftleeren Raum.

        hm. Versuch doch mal etwas in Richtung <xsl:template match="*" /> o.ä. am Ende.

        Cheatah

        1. hallo Cheatah

          hm. Versuch doch mal etwas in Richtung <xsl:template match="*" /> o.ä. am Ende.

          am ende von was? ;-)
          und mit <xsl:template match="*" />  selektiert man alle kinderknoten des kontext-knotens ( * ist hier die abkürzung für child::*) aber weder attribut- und schon gar nicht textknoten.

          grüße
          thomas

      2. Hallo Paul,

        Mein XSLT-Prozessor (Sabotron 0.81) hat mich aber eines besseren belehrt. Inhalte von nicht definierten Elementen schreibt der einfach so in den Luftleeren Raum.

        Das tut der mit Sicherheit nicht, wenn du ihn nicht dazu anweist. Wahrscheinlich hast du für deinen Root-Knoten eine xsl:apply-templates-Anweisung notiert, die dafür sorgt, das ALLE Kind-Elemente des Root-Knoten abgearbeitet werden. Für einige dieser Kinder hast du dann keine Template Rules definiert und dann greifen die eingebauten Template Rules, für den Fall dass keine Template Rule für ein Element gefunden wird und es kann zu einer unerwünschten Ausgabe kommen. Aber eigentlich auch immer nur zur unerwünschten Ausgabe von TEXTknoten.

        Folglich reicht es eine leere Template Rule für Textknoten zu definieren:

        <xsl:template match="text()"/>

        Wenn du deine Template Rules direkt mit <xsl:apply-templates select="element"/> ansteuerst sparst du Dir das.

        Das ist aber alles bei XSLT immer nur Raterei ohne Quelldokument Stylesheet und gewünschten und tatsächlichen Output....

        Gruß
        Franz

        1. Hallo Franz,

          Zunächst mal Danke, mit <xsl:template match="text()"/> gehts.

          Wenn du deine Template Rules direkt mit <xsl:apply-templates select="element"/> ansteuerst sparst du Dir das.

          Allerdings macht es keinen Unterscheid ob ich den root-node mit "/" oder seinem Namen anspreche. oder hab ich da was falsch verstanden?

          Paul

          1. Hallo Franz,

            Wenn du deine Template Rules direkt mit <xsl:apply-templates select="element"/> ansteuerst sparst du Dir das.

            Allerdings macht es keinen Unterscheid ob ich den root-node mit "/" oder seinem Namen anspreche. oder hab ich da was falsch verstanden?

            Der Wurzelknoten in XSLT/XPath ist sowas wie ein abstrakter Knoten. Ihn sprichst Du mit "/" an. Das Wurzelelement des Quelldokuments ist das Kind des Wurzelknotens (Root-Knotens). Das musst du dann explizit ansprechen.

            Was ich meinte ist aber:

            <xsl:template match="/adresse">
              xsl:apply-templates/
            </xsl:template>

            sucht die Template Rules für ALLE Kinder des Elements adresse

            <xsl:template match="/adresse">
              <xsl:apply-templates select="mail"/>
            </xsl:template>

            sucht nur Template Rules für das Kindelement mail von adresse. Dadurch hast du mehr Kontrolle darüber welche Template Rules instantiiert werden und es kommt nicht zu unerwünschten Ausgaben.

            Gruß
            Franz