Discussion:
XSLT | Ausgabe von Text-Elementen verhindern
(zu alt für eine Antwort)
Christoph Happich
2003-08-31 21:42:49 UTC
Permalink
Hi NG,

ich habe einen Satz von XML-Dokumenten, aus denen ich mittels XSLT für
mich relevante Daten ziehe und nach HTML transformiere.
Mein Problem ist, dass ich wirklich nur ein paar der Elemente wirklich
benötige, die Inhalte der Text-Elemente aber immer mit ausgegeben
werden, auch wenn keines meiner Templates matcht.

Wie kann ich das verhindern? muss ich für jedes dieser Elemente ein
<xsl:template match="elementname" />
einführen? Oder eins das alles matcht (macht mir Angst)? Wie macht ihr
das? Gibt es einen eleganten Weg?

Gruss, Christoph
Henrik Motakef
2003-08-31 21:59:43 UTC
Permalink
Post by Christoph Happich
Mein Problem ist, dass ich wirklich nur ein paar der Elemente wirklich
benötige, die Inhalte der Text-Elemente aber immer mit ausgegeben
werden, auch wenn keines meiner Templates matcht.
Wie kann ich das verhindern?
Was ist ein Text-Element?

Wenn du gar keine Textknoten automatisch ausgeben lassen willst, hilft
<template match="text()"/>. Dann musst du dich immer selber darum
kümmern, z.B. mit geeigneten "value-of"s in anderen Templates, oder in
dem du das mit <template match="textelement/text()>...</template> u.ä.
für bestimmte Texte wieder überschreibst.

Oder du sorgst gleich dafür, dass die Textknoten, die du nicht willst,
gar nicht erst bearbeitet werden, z.B. durch geschickt gewählte
<apply-template select="...">s. Was am einfachsten ist hängt davon ab,
wie deine Daten aussehen, das kann man so nicht sagen.
Post by Christoph Happich
muss ich für jedes dieser Elemente ein
<xsl:template match="elementname" />
einführen? Oder eins das alles matcht (macht mir Angst)?
Wieso Angst? Welches Template wofür angewendet wird ist klar definiert
und durchaus verständlich. Wenn du zum Beispiel eins für "*" und eins
für "elementname" hast, wird für elementname-Elemente immer das zweitere
benutzt.

Empfohlene Lektüre: Abschnitt 5.5 "Conflict Resolution for Template
Rules" in der XSLT-Spec <http://www.w3.org/TR/xslt#conflict>, und 5.8
"Built-in Template Rules" <http://www.w3.org/TR/xslt#built-in-rule> für
die Erklärung, wo die ungewollten Texte herkommen.
Erhard Schwenk
2003-09-01 21:02:33 UTC
Permalink
Post by Christoph Happich
Hi NG,
ich habe einen Satz von XML-Dokumenten, aus denen ich mittels XSLT für
mich relevante Daten ziehe und nach HTML transformiere.
Mein Problem ist, dass ich wirklich nur ein paar der Elemente wirklich
benötige, die Inhalte der Text-Elemente aber immer mit ausgegeben
werden, auch wenn keines meiner Templates matcht.
Da machst Du irgendwas falsch.
Post by Christoph Happich
Wie kann ich das verhindern? muss ich für jedes dieser Elemente ein
<xsl:template match="elementname" />
einführen? Oder eins das alles matcht (macht mir Angst)? Wie macht ihr
das? Gibt es einen eleganten Weg?
<xsl:template match="/">
<xsl:value-of select="/myobject"/>
</xsl:template>
--
Erhard Schwenk

Akkordeonjugend Baden-Württemberg - http://www.akkordeonjugend.de
K-ITX Webhosting - http://webhosting.k-itx.net
Christoph Happich
2003-09-03 07:55:47 UTC
Permalink
Post by Erhard Schwenk
Post by Christoph Happich
Hi NG,
ich habe einen Satz von XML-Dokumenten, aus denen ich mittels XSLT für
mich relevante Daten ziehe und nach HTML transformiere.
Mein Problem ist, dass ich wirklich nur ein paar der Elemente wirklich
benötige, die Inhalte der Text-Elemente aber immer mit ausgegeben
werden, auch wenn keines meiner Templates matcht.
Da machst Du irgendwas falsch.
Post by Christoph Happich
Wie kann ich das verhindern? muss ich für jedes dieser Elemente ein
<xsl:template match="elementname" />
einführen? Oder eins das alles matcht (macht mir Angst)? Wie macht ihr
das? Gibt es einen eleganten Weg?
<xsl:template match="/">
<xsl:value-of select="/myobject"/>
</xsl:template>
Versteh ich nicht. Kannst du das nicht irgendwie kommentieren? Soll das
mir sagen, dass ich nur /ein/ <xsl:template> habe und den Rest, den ich
brauche mir mit XPath aus der Struktur hole? So hab ich das auch schon
mal gemacht -- dadurch muss ich aber auf die feinen rekursiven
Möglichkeiten von XSLT verzichten. Möchte ich nicht.

Andere Variante, die ich ausprobiert habe: Modi für die Templates. Das
fand ich aber so unaufgeräumt.

Aber eigendlich ist meine Frage schon beantwortet: es gibt keine
allgemeine Lösung (die ich übersehen haben könnte). Ich muss mir einfach
je nach Aufgabe was praktisches überlegen.

Gruss, Christoph
Bernhard Kraft
2003-09-16 14:03:42 UTC
Permalink
Post by Christoph Happich
Post by Erhard Schwenk
<xsl:template match="/">
<xsl:value-of select="/myobject"/>
</xsl:template>
Versteh ich nicht. Kannst du das nicht irgendwie kommentieren? Soll das
mir sagen, dass ich nur /ein/ <xsl:template> habe und den Rest, den ich
brauche mir mit XPath aus der Struktur hole? So hab ich das auch schon
mal gemacht -- dadurch muss ich aber auf die feinen rekursiven
Möglichkeiten von XSLT verzichten. Möchte ich nicht.
Das war so gemeint:
Wenn Du ein Root-Template hast, bist Du den ganzen Ärger mit
den Textknoten los. Aus dem Root-Template kannst Du dann
weiter Templates aufrufen (auch welche mit Namen).

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="//NURDASWASICHWILL"/>
</xsl:template>

<xsl:template match="NURDASWASICHWILL">
<xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

Loading...