Bene: Problem mit Texten in Element bei Transformation

Hallo,

ich versuche gerade mich in XSLT einzuarbeiten.
Bei folgender Aufgabenstellung komme ich nicht weiter:

XML:

  
<?xml version="1.0" encoding="iso-8859-1" ?>  
<quiz>  
 <elem>my name is <toinsert correct="example-name" /> and i live in <toinsert correct="example-city" /></elem>  
</quiz>  

XSLT:

  
<?xml version="1.0" encoding="iso-8859-1"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  
<xsl:output method="html"/>  
  
<xsl:template match="/">  
 <xsl:apply-templates select="quiz/elem"/>  
</xsl:template>  
  
<xsl:template match="elem">  
<xsl:apply-templates select="toinsert"/>  
</xsl:template>  
  
<xsl:template match="toinsert">  
<input type="text" /><xsl:value-of select="."/>  
</xsl:template>  
  
</xsl:stylesheet>  

Bei der Transformation sollen die Elemente toinsert durch Eingabefelder ersetzt werden und der Wert des Attributes correct als Vorgabewert dienen.

Meine Probleme:

  • ich kann zwar die Elemente toinsert in Eingabefelder umwandeln, allerdings fehlt der Text davor und dahinter.
  • Den Wert des Attributes als Value zu nehmen, funktioniert bei mir nicht, da es bei value='<Ausdruck xslt>' zu einem Parserfehler kommt.
    Gibt es eine Möglichkeit den Wert auszulesen und in einer Variablen zwischenzuspeichern?

Danke und Viele Grüße
Bene

  1. Hi Bene!

    zu 1. schon mal

    <xsl:template match="elem">
    <xsl:value-of select="."/>
    <xsl:apply-templates select="toinsert"/>
    <xsl:value-of select="."/>
    </xsl:template>

    probiert?

    zu 2. ein kleiner Tip:http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#attribute

    Grüsse,
    Richard

    1. Hallo,

      zu 1. schon mal

      <xsl:template match="elem">
      <xsl:value-of select="."/>
      <xsl:apply-templates select="toinsert"/>
      <xsl:value-of select="."/>
      </xsl:template>

      probiert?

      Autch!
      Damit gibt er den Textinhalt vom "elem" vor _und_ nach "toinsert" aus, d.h. doppelt.

      Grüße
      Thomas

      1. Hallo,

        Danke für eure Hilfe und Hinweise.

        für die Attributgeschichte habe ich folgende Lösung gefunden:

          
        <xsl:template match="toinsert">  
        <input>  
        <xsl:attribute name="value"><xsl:value-of select="@correct"/></xsl:attribute>  
        </input>  
        </xsl:template>  
        
        

        Das Ergebnis ist das folgende:

          
        <input value="example-name"/>  
        
        

        Dazu noch folgende Fragen:

        • ist meine Vorgehensweise so korrekt? Denn ich will ja ein in sich geschlossenes input-Tag, schreibe hier aber ein öffnendes und geschlossenes Tag.
        • Bei in sich geschlossenen Tags wird ja in HTML gerne noch ein Leerzeichen vor dem Schrägstrich eingefügt, wegen den älteren Browsern. Gibt es eine Möglichkeit dies einzubauen?

        Grüße
        Bene

        1. Hallo,

          Dazu noch folgende Fragen:

          • ist meine Vorgehensweise so korrekt? Denn ich will ja ein in sich geschlossenes input-Tag, schreibe hier aber ein öffnendes und geschlossenes Tag.

          Ja das ist korrekt so.
          Du kannst es aber auch so machen:

            
          <xsl:template match="toinsert">  
               <input value="{@correct}" />  
          </xsl:template>  
          
          

          das » {} « nennt man bei dieser Verwendung AVT (Attribute Value Template).

          • Bei in sich geschlossenen Tags wird ja in HTML gerne noch ein Leerzeichen vor dem Schrägstrich eingefügt, wegen den älteren Browsern. Gibt es eine Möglichkeit dies einzubauen?

          Generell nein.
          Einige XSLT-Prozessoren bieten Kommandozeilenargumente an, mit deren Hilfe du solche Sachen bestimmen kannst.
          Oder du nimmst HTML als Ausgabeformat (output method="html").

          Grüße
          Thomas

          1. Hallo,

            Du kannst es aber auch so machen:

            <xsl:template match="toinsert">
                 <input value="{@correct}" />
            </xsl:template>

            
            >   
            > das » {} « nennt man bei dieser Verwendung AVT (Attribute Value Template).  
              
            Super, das ist auf jeden Fall der bessere Weg.  
              
              
            
            > Oder du nimmst HTML als Ausgabeformat (output method="html").  
            
            Mein Ergebnis war dann nicht korrektes XHTML (<input type="text">).  
              
            Für XHTML habe ich folgende Lösung gefunden:  
            ~~~xml
              
            <xsl:output method="xml" indent="yes"  
                doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"  
                doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" />  
            
            

            Jetzt habe ich noch ein Problem:
            Das Quiz soll in eine bestehende Webseite eingebunden werden. Bei der jetztigen Ausgabe steht aber immer der Prolog und Doctype davor. Ist das auch über Einstellungen zu regeln? Ich hab dazu nix gefunden.

            Danke und Grüße
            Bene

            1. Hallo,

              Für XHTML habe ich folgende Lösung gefunden:

              <xsl:output method="xml" indent="yes"
                  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
                  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" />

              
              >   
              > Jetzt habe ich noch ein Problem:  
              > Das Quiz soll in eine bestehende Webseite eingebunden werden. Bei der jetztigen Ausgabe steht aber immer der Prolog und Doctype davor. Ist das auch über Einstellungen zu regeln? Ich hab dazu nix gefunden.  
              >   
                
              Wenn ich dich richtig verstehe, dann suchst du folgendes:  
                
              ~~~xml
                
                 <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />  
              
              

              Grüße
              Thomas

              1. Hallo Thomas,

                <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

                  
                Das löst das Problem nur teilweise, da die Doctype-Deklaration trotzdem ausgegeben wird. Die Doctype-Angabe brauche ich ja für die korrekte Ausgabe der XHTML Elemete (z.B. Eingabefeld als <input type="text" />).  
                Gibt es auch dafür eine Angabe? Die gleiche Problemstellung habe ich in einem anderen Forenbeitrag entdeckt. Dort war die Lösung das das XML eingelesen wird und dann über die DOM-Schnittstelle der Doctype entfernt wird. Schöner fände ich es per Einstellung ;-)  
                  
                Grüße und Danke!  
                Bene  
                  
                
                
                1. Hallo Thomas,

                  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

                  
                  >   
                  > Das löst das Problem nur teilweise, da die Doctype-Deklaration trotzdem ausgegeben wird. Die Doctype-Angabe brauche ich ja für die korrekte Ausgabe der XHTML Elemete (z.B. Eingabefeld als <input type="text" />).  
                    
                    
                  Sorry, aber hä???  
                  Die Doctype-Angabe brauchst du nicht. Du brauchst nur method="xml". Dem XSLT-Prozessor ist es ziemlich egal welche Doctype dein End-Dokument haben wird, er geht lediglich von der Angabe im method="" aus.  
                    
                  Grüße  
                  Thomas
                  
                  1. Sorry, aber hä???
                    Die Doctype-Angabe brauchst du nicht. Du brauchst nur method="xml". Dem XSLT-Prozessor ist es ziemlich egal welche Doctype dein End-Dokument haben wird, er geht lediglich von der Angabe im method="" aus.

                    Ja das hätte ich auch gedacht, allerdings gibt es tatsächlich abhängig ob Doctype verwendet wird, eine andere Ausgabe:

                      
                    <xsl:output method="html" indent="yes" omit-xml-declaration="yes" />  
                    
                    

                    liefert:

                      
                    <quiz>my name is <input type="text"> and i live in <input type="text">my pets name is <input type="text"> and his brothers name is <input type="text"></quiz>  
                    
                    

                    Hier werden die input-tags nicht xhtml-konform geschlossen.

                      
                    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />  
                    
                    

                    liefert:

                      
                    <quiz>my name is <input type="text"/> and i live in <input type="text"/>my pets name is <input type="text"/> and his brothers name is <input type="text"/></quiz>  
                    
                    

                    Hier fehlt das Leerzeichen vor dem schließenden Slash.

                      
                    <xsl:output method="xml" indent="yes"  
                        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"  
                        doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" omit-xml-declaration="yes" />  
                    
                    

                    liefert:

                      
                    <!DOCTYPE quiz PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
                    <quiz>my name is <input type="text" /> and i live in <input type="text" />my pets name is <input type="text" /> and his brothers name is <input type="text" /></quiz>  
                    
                    

                    Hier ist alles perfekt, nur die Doctype-Erklärung steht halt im Ergebnis.

                    Viele Grüße und Danke
                    Benedikt

                    1. Hallo,

                      Sorry, aber hä???
                      Die Doctype-Angabe brauchst du nicht. Du brauchst nur method="xml". Dem XSLT-Prozessor ist es ziemlich egal welche Doctype dein End-Dokument haben wird, er geht lediglich von der Angabe im method="" aus.

                      Ja das hätte ich auch gedacht, allerdings gibt es tatsächlich abhängig ob Doctype verwendet wird, eine andere Ausgabe:

                      <xsl:output method="html" indent="yes" omit-xml-declaration="yes" />

                      
                      > liefert:  
                      > ~~~html
                        
                      
                      > <quiz>my name is <input type="text"> and i live in <input type="text">my pets name is <input type="text"> and his brothers name is <input type="text"></quiz>  
                      > 
                      
                      

                      Hier werden die input-tags nicht xhtml-konform geschlossen.

                      Ja, das ist normal.

                      <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

                      
                      > liefert:  
                      > ~~~html
                        
                      
                      > <quiz>my name is <input type="text"/> and i live in <input type="text"/>my pets name is <input type="text"/> and his brothers name is <input type="text"/></quiz>  
                      > 
                      
                      

                      Hier fehlt das Leerzeichen vor dem schließenden Slash.

                      Auch normal.
                      Aber das "weil ältere Browser" kann man mittlerweile vergessen.

                      <xsl:output method="xml" indent="yes"
                          doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
                          doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" omit-xml-declaration="yes" />

                      
                      > liefert:  
                      > ~~~html
                        
                      
                      > <!DOCTYPE quiz PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
                      > <quiz>my name is <input type="text" /> and i live in <input type="text" />my pets name is <input type="text" /> and his brothers name is <input type="text" /></quiz>  
                      > 
                      
                      

                      Hier ist alles perfekt, nur die Doctype-Erklärung steht halt im Ergebnis.

                      Interessant, welcher XSLT-Prozessor?

                      Grüße
                      Thomas

                      1. Hallo Thomas,

                        Interessant, welcher XSLT-Prozessor?

                        Mein PHP-Skript:

                          
                        $doc = new DOMDocument();  
                        $xsl = new XSLTProcessor();  
                          
                        $doc->load("books-transform.xsl");  
                        $xsl->importStyleSheet($doc);  
                          
                        $doc->load("books.xml");  
                        $resXML = $xsl->transformToXML($doc);  
                        echo $resXML;  
                        
                        

                        es basiert auf der libxslt library (http://xmlsoft.org/XSLT/)

                        Aber das "weil ältere Browser" kann man mittlerweile vergessen.

                        Ok, dann spricht ja nichts gegen die Lösung mit output xml und ohne doctype. Hast du nähere Infos was unter "älternen Browser" verstanden wird? Netscape 4? IE5.0?

                        Viele Grüße
                        Bene

                        1. Hallo,

                          Interessant, welcher XSLT-Prozessor?
                          es basiert auf der libxslt library (http://xmlsoft.org/XSLT/)

                          Danke für die Info.

                          Aber das "weil ältere Browser" kann man mittlerweile vergessen.
                          Ok, dann spricht ja nichts gegen die Lösung mit output xml und ohne doctype. Hast du nähere Infos was unter "älternen Browser" verstanden wird? Netscape 4? IE5.0?

                          Genau: NS 4.x und IE < 6 , Opera < 7, Mozilla (engin) < 1.0.1, bzw. Mozilla 1.1 beta, Safari < 0.9, Konqueror < 3.2.
                          Also in der Regel könnte man sagen, all jene Browser die keine DOCTYPE-Switch können.

                          Grüße
                          Thomas

                          1. Hallo,

                            Gut, dann ist von meiner Seite alles abschließend geklärt.
                            Danke Thomas für die netten und hilfreichen Antworten.

                            Viele Grüße
                            Bene

  2. Hallo,

    XSLT:

    <xsl:template match="elem">

    das hier:

    <xsl:apply-templates select="toinsert"/>

    so schreiben:
    <xsl:apply-templates />

    </xsl:template>

      
    Grüße  
    Thomas
    
    1. Hallo Thomas,

      <xsl:template match="elem">

      das hier:

      <xsl:apply-templates select="toinsert"/>

      so schreiben:
      <xsl:apply-templates />

      </xsl:template>

        
      funktioniert einwandfrei. Vielen Dank!  
        
      Grüße  
      Bene