Henning1980: Ausblenden von einem bestimmten Knoten

Hallo zusammen,

ich bin nicht so dicke mit XSL und bräuchte mal Hilfe.

Ich habe eine XML-Datei die sieht ungefähr so aus.

<library language="en">
    <chapter name="Name der Hilfedatei">
        <section name="Name von Sektion1">
            <topic name="Topic 1">
                <desc>Längere Beschreibung</desc>
            <topic name="Topic 2">
            <topic name="Topic 3">
            <topic name="Topic 4">
            <topic name="Topic 5">
            <topic name="Topic 6">
        <section name="Name von Sektion2">
        <section name="Name von Sektion3">
            <func name="Name von Funktion">
                <desc>Längere Beschreibung</desc>
        <section name="Name von Sektion4">
        <section name="Name von Sektion5">
        <section name="Name von Sektion6">
            <topic name="Topic 1">
            <topic name="Topic 1">
            <topic name="Topic 1">
            <section name="Name von Untersektion">
                <func name="Name von Funktion">
                <func name="Name von Funktion">
                    <desc>Längere Beschreibung</desc>
                    <table>Weiterer Inhalt</table>
        <section name="Name von Sektion7">
    </chapter>
</library>

Das meiste habe ich schon soweit hinbekommen, wie ich es haben will aber ich finde keine Möglichkeit zum Ausblenden von bestimmten Knoten. In diesem Fall "<table>". Es sind in der Quell-Datei noch mehr Sachen zum Ausblenden innerhalb von dem Tag "desc" aber ich will erstmal klein anfangen.

Ich habe das hier gefunden

<xsl:template match="table"/>  

<xsl:template match="@\* | node()">  
	<xsl:copy>  
		<xsl:apply-templates select="@\* | node()"/>  
	</xsl:copy>  
</xsl:template>  

Das funktioniert bestimmt (auch wenn ich die Logik nicht verstehe) aber in meiner XSL klappt das nicht. Wo muss ich das denn einbauen oder tappe ich komplett im Dunkeln???

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" version="4.0" indent="yes"/>
 <xsl:key name="nr1" match="section" use="@name"/>
 <xsl:template match="/">
  <html>
   <body>
   <table border="1" >
     <tr>
       <xsl:for-each select="key('nr1', 'Writing Indicators and Strategies')">
         <td valign="top" align="left"><xsl:value-of select="@name"/></td>
       </xsl:for-each>
     </tr>
     <tr>
       <xsl:for-each select="library/chapter/section[@name='Writing Indicators and Strategies']/topic">
         <td valign="top" align="left"><xsl:value-of select="@name"/></td>
       </xsl:for-each>
     </tr>
     <tr>
       <xsl:for-each select="library/chapter/section[@name='Writing Indicators and Strategies']/topic">
         <td valign="top" align="left"><xsl:value-of select="desc"/></td>
       </xsl:for-each>
     </tr>
   </table>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>

Vielen Dank im Voraus.

Gruß
Henning

  1. Hallo Henning,

    Ich habe eine XML-Datei die sieht ungefähr so aus.

    ... ist nicht wohlgeformt, also für Tests ungeeignet.

    Ich habe das hier gefunden

    <xsl:template match="table"/>

    <xsl:template match="@* | node()">
    xsl:copy
    <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
    </xsl:template>

    Das funktioniert bestimmt (auch wenn ich die Logik nicht verstehe) aber in meiner XSL klappt das nicht. Wo muss ich das denn einbauen oder tappe ich komplett im Dunkeln???

    Es handelt sich um die Identitätstransformation, welche eine 1:1-Kopie des Ausgangsdokuments erzeugt, wobei die leere Regel für das table-Element dessen Ausgabe verhindert.

    Strukturiere die Transformation unter mehrfacher Verwendung von xsl:template und geeigneten xsl:apply-templates-Zuweisungen.

    Grüße,
    Thomas