André Laugks: apply-templates und Element "überspringen"

Beitrag lesen

Hallo Franz!

Somit erhälst du die Ausgabe von Vorname und Nachname jeweils eingeschlossen durch <b>-Tags.

Ich wollte sehen, welchen Text/Textknoten wie "genommen" wird.

Sobald ich aber <xsl:apply-templates select="eintrag"/> nehme, bekomme ich nichts mehr ausgegeben. Ich wähle doch den Knoten "eintrag" aus?

Nein es bezieht sich auf den Wurzel*knoten*, eine abstrakte Wurzel, deren einziges Kind das Wurzel*element* <liste> ist. Du musst daher dieses Element auch noch ansteuern.

Und da setzt es manchmal bei mir aus.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <html>
  <body>
   xsl:apply-templates/
  </body>
 </html>
</xsl:template>
<xsl:template match="eintrag">
  <b><xsl:value-of select="."/></b>
</xsl:template>
</xsl:stylesheet>

Es wird durch den Baum gewandert. Sobald xsl:apply-templates/ auf ein Temlate stößt, welches zu einem Konten im Baum gehört, wird es angewendet. Überspringt xsl:apply-templates/ die Elemente "liste" und "eintrag"? Ich sage mal ja.

Oder...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <html>
   <body>
    xsl:apply-templates/
   </body>
  </html>
 </xsl:template>

<xsl:template match="vorname">
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

Hier bekomme ich "André Laugks Werner Otto" ausgegeben. Ich steuere doch jeweils nur das Element "vorname" an bzw. habe dafür ein Template definiert.

Mit ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <html>
   <body>
    xsl:apply-templates/
   </body>
  </html>
 </xsl:template>

<xsl:template match="eintrag">
  <xsl:value-of select="vorname"/>
 </xsl:template>
</xsl:stylesheet>

... bekomme ich die Vornamen ausgegeben. Da hackt es noch.

Aber so ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <html>
   <body>
    <xsl:apply-templates select="eintrag"/>
   </body>
  </html>
 </xsl:template>

<xsl:template match="eintrag">
  <xsl:value-of select="vorname"/>
 </xsl:template>
</xsl:stylesheet>

... selectiere ich direkt das Element "eintrag". Mmmmhhhhhhh....

Um noch mal die Pfade klar zu stellen?!

<?xml version="1.0" encoding="iso-8859-1"?>

-> /

<?xml version="1.0" encoding="iso-8859-1"?>
<liste>
</liste>

-> /liste

<?xml version="1.0" encoding="iso-8859-1"?>
<liste>
 <eintrag>
 </eintrag>
 <eintrag>
 </eintrag>
</liste>

-> /liste/eintrag

<?xml version="1.0" encoding="iso-8859-1"?>
<liste>
 <eintrag>
   <vorname></vorname>
   <nachname></nachname>
 </eintrag>
 <eintrag>
   <vorname></vorname>
   <nachname></nachname>
 </eintrag>
</liste>

-> /liste/eintrag/vorname
-> /liste/eintrag/nachname

Du kannst höchstens mit benannten Templates arbeiten und die dann wie Funktionen irgendwo in einem Template aufrufen.

Ja, daran habe ich dann gestern nach dem posten auch gedacht. Für mich vielleicht leichter.

Vielleicht denke ich noch zu sehr an JavaScript, wo man "Element" direkt ansprechen kann.

MfG, André Laugks
L-Andre @ gmx.de