Michael_K: XSLT Verständnisfrage

Hallo,

Ich stehe gerade komplett auf dem Schlauch, weil ein XSLT Transformation mir wilde Ergebnisse ausgibt. Ich kann leider nicht den vollen Code hier ausführen, deshalb nur meine Fragestellung, wenn zum Beispiel folgendes XML existiert:

<root>
 <one></one>
 <two>first text</two>
 <two>second text</two>
</root>

im xslt code gibt es u.a. diese templates

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

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

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

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

Ich erhalte nun als Ergebnis:

<body>
  <h1>
     <h2>first text</h2>
     <h2>second text</h2>
  </h1>
</body>

ich hätte aber folgendes Ergebnis erwartet:

<body>
  <h1></h1>
  <h2>first text</h2>
  <h2>second text</h2>
</body>

Mein Frage deshalb: War meine Annahme falsch, dass xsl:apply-templates/ ohne das select Attribute sich immer auf die Unterknoten des aktuellen Knoten bezieht?

Gruß

  1. Hi,

    Ich stehe gerade komplett auf dem Schlauch, weil ein XSLT Transformation mir wilde Ergebnisse ausgibt. Ich kann leider nicht den vollen Code hier ausführen, deshalb nur meine Fragestellung, wenn zum Beispiel folgendes XML existiert:

    <root>
     <one></one>
     <two>first text</two>
     <two>second text</two>
    </root>
    

    im xslt code gibt es u.a. diese templates

    <xsl:template match="node()|@*">
              <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
              </xsl:copy>
     </xsl:template> 
    
    <xsl:template match="root"">
            <body>
               <xsl:apply-templates/>
           </body>
      </xsl:template>
    
    <xsl:template match="one">
            <h1>
               <xsl:apply-templates/>
           </h1>
      </xsl:template>
    
     <xsl:template match="two">
            <h2>
              <xsl:apply-templates/>
           </h2>
      </xsl:template>
    

    ich hätte aber folgendes Ergebnis erwartet:

    ich hätte eine Fehlermeldung erwartet, da das XSLT einen Syntaxfehler enthält (bei root sind 2 "" nach dem root.

    Ansonsten (nach Korrektur des Fehlers) hätte ich

    <body>
      <h1/>
      <h2>first text</h2>
      <h2>second text</h2>
    </body>
    

    erwartet.

    Ausprobiert (auf XSLT Tester Appspot), und meine Erwartung wird bestätigt.

    Gibt es evtl. ein anderes Template (das hier nicht dabei ist), das auch auf h1 zutrifft?

    Für ThomasM vermutlich noch interessant: welches Tool nutzt Du zur Transformation?

    cu,
    Andreas a/k/a MudGuard

  2. Hallo Michael,

    Hallo,

    Ich stehe gerade komplett auf dem Schlauch, weil ein XSLT Transformation mir wilde Ergebnisse ausgibt. Ich kann leider nicht den vollen Code hier ausführen, deshalb nur meine Fragestellung, wenn zum Beispiel folgendes XML existiert:

    <root>
     <one></one>
     <two>first text</two>
     <two>second text</two>
    </root>
    

    im xslt code gibt es u.a. diese templates

    <xsl:template match="node()|@*">
              <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
              </xsl:copy>
     </xsl:template> 
    
    <xsl:template match="root"">
            <body>
               <xsl:apply-templates/>
           </body>
      </xsl:template>
    
    <xsl:template match="one">
            <h1>
               <xsl:apply-templates/>
           </h1>
      </xsl:template>
    
     <xsl:template match="two">
            <h2>
              <xsl:apply-templates/>
           </h2>
      </xsl:template>
    

    Ich erhalte nun als Ergebnis:

    <body>
      <h1>
         <h2>first text</h2>
         <h2>second text</h2>
      </h1>
    </body>
    

    ich hätte aber folgendes Ergebnis erwartet:

    <body>
      <h1></h1>
      <h2>first text</h2>
      <h2>second text</h2>
    </body>
    

    Ja, das erhalte ich auch (mit Saxon-HE 12.8 und als XSLT ≥1.0 formuliert). Wobei das zunächst gar nicht funktioniert hat, da hier ein " zuviel stand:

    <xsl:template match="root"">
    

    Grüße,
    Thomas

    1. Nachtrag: Ich meinte das mit <h1></h1> erhaltene Ergebnis (bei method="html" entsteht das Schließtag, bei method="xml" = default nur <h1/>).

      Grüße,
      Thomas