Announcement

Collapse
No announcement yet.

XHTML zu XML via XSLT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XHTML zu XML via XSLT

    Hallo Zusammen,

    ich bin sehr unerfahren was XSLT angeht und komme einfach nicht weiter. Ich will eine XHTML Datei nach XML via XSLT umwandeln. Die XHTML Datei besitzt keine Auffälligkeiten. Folgende xls Datei habe ich:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="iso-8859-1" 
    	xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="2" />
    	
    	<xsl:template match="head">
    		<biographie>
    			<person>
    			      <xsl:value-of select="title"/>
    			</person>
    		</biographie>			
    	</xsl:template>
    </xsl:transform>
    Dies soll ausgehend vom <head>, mir den Inhalt des <title> Elements in eine XML Datei schreiben. Was ich aber bekomme ist eine XML Datei, die alle textuellen Inhalte der XHTML Datei enthält, jedoch nicht die Teile wie zb <biographie> usw, geschweige denn dem title. Was mache ich falsch?

    P.S.: Ich verwende XALAN

  • #2
    Es greifen hier offenbar nur die Default-Templates, die alle Elemente und deren Inhalte durchgehen. Füge ein zusätzliches Template in dieser Form ein:

    Code:
    <xsl:template match="html">
      <xsl:apply-templates select="head"/>
    </xsl:template>
    Falls das nicht hilft, poste den relevanten XHTML-Code zum Testen.

    Comment


    • #3
      Das brachte leider nichts. Der XSLT Code sieht jetzt so aus. Die Eingabe ist auch anbei. Vielen Dank schonmal

      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:output method="xml" indent="yes" encoding="iso-8859-1"
           xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="2"/>
          
          <xsl:template match="head">
              <biographie>
                  <person>
      				<xsl:value-of select="title"/>
                  </person>
              </biographie>
          </xsl:template>
      	<xsl:template match="html">
      	  <xsl:apply-templates select="head"/>
      	</xsl:template>
      </xsl:transform>
      Code:
      <!DOCTYPE html  [
      
      	<!ENTITY auml	"&#xE4;">
      <!ENTITY ouml	"&#xF6;">
      <!ENTITY uuml	"&#xFC;">
      <!ENTITY Auml	"&#xC4;">
      <!ENTITY Ouml	"&#xD6;">
      <!ENTITY Uuml	"&#xDC;">
      <!ENTITY szlig	"&#xDF;">
      <!ENTITY nbsp	"&#xA0;">
      ] >
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      
      <head>
      <meta name="generator" content=
      "HTML Tidy for Windows (vers 22 March 2008), see www.w3.org" />
      <title>Klassika: Johann Sebastian Bach (1685-1750)</title>
      <base href="http://www.klassika.info/" target="_top" />
      <link rel="stylesheet" type="text/css" href="/klassika.css" media=
      "all" />
      <link rel="stylesheet" type="text/css" href="/klassika_druck.css"
      media="print" />
      <script type="text/javascript" src="/klassika.js">
      </script>
      <script type="text/javascript" src="/prototype.js">
      </script>
      <meta name="author" content="Markus Hillenbrand" />
      <meta name="copyright" content="Markus Hillenbrand" />
      <meta name="publisher" content="www.klassika.info" />
      <meta name="coverage" content="Worldwide" />
      <meta name="revisit_after" content="10 days" />
      <meta name="robots" content="all" />
      <meta name="description" content=
      "Informationen zu Leben und Werk von Johann Sebastian Bach (1685-1750)" />
      <meta name="keywords" content=
      "Johann Sebastian Bach, Komponist, Werkverzeichnis, Werke, Oeuvre, Musik, Klassik, CD, DVD, Noten" />
      <meta http-equiv="pragma" content="no-cache" />
      <meta http-equiv="cache-control" content="no-cache" />
      <meta http-equiv="cache-control" content="no-store" />
      <meta http-equiv="content-language" content="de" />
      <meta http-equiv="expires" content="0" />
      <meta http-equiv="content-type" content=
      "text/html; charset=UTF-8" />
      <link rel="alternate" type="application/rss+xml" title=
      "Klassika RSS" href="/Komponisten/Bach/historie.rss" />
      </head>
      <body>
      </body>
      </html>

      Comment


      • #4
        Beachte den XHTML-Namensraum auch im XSLT-Stylesheet (html ist hier ein Pseudo-Prefix, da der NS im Ausgangsdokument als Vorgabe-NS steht und somit kein ansprechbares Prefix vorhanden ist, aber dennoch eine Unterscheidung benötigt wird - unter XSLT 2.0 würde übrigens die Belegung von xpath-default-namespace ausreichen):

        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:html="http://www.w3.org/1999/xhtml" exclude-result-prefixes="html">
        
          <xsl:output method="xml" indent="yes" encoding="iso-8859-1"
            xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="2"/>
        
          <xsl:template match="html:head">
            <biographie>
              <person>
                <xsl:value-of select="html:title"/>
              </person>
            </biographie>
          </xsl:template>
        
          <xsl:template match="html:html">
            <xsl:apply-templates select="html:head"/>
          </xsl:template>
        
        </xsl:transform>

        Comment


        • #5
          Super, besten Dank, nun geht es. Das mit dem Namespace habe ich nicht bedacht. Ich dachte weil im Ausgangsdokument nur "head" steht, kann XSLT das auch einfach so matchen. Aber für XSLT sehen die durch die Namespace-Vorgabe wie du sagst, sicher alle nach xhtml:irgendwas aus.

          Und ich muss jetzt jedes Element durch den NS-Prefix ansprechen?

          Comment


          • #6
            Originally posted by Mork0075 View Post
            Und ich muss jetzt jedes Element durch den NS-Prefix ansprechen?
            Ja, zumindest die Elemente in einem bestimmten Namensraum und das sind in diesem Fall alle. Entferne alternativ den NS-Eintrag oder steige auf XSLT 2.0 um (unterstützt in den freien Prozessoren Saxon 9.0B, AltovaXML 2008 und etwas eingeschränkt in Gestalt 1.0). Dann wäre xpath-default-namespace möglich und die HTML-Elemente können ohne Prefix angesprochen werden:

            Code:
            <xsl:stylesheet version="2.0" ... xpath-default-namespace="http://www.w3.org/1999/xhtml">
            
             <xsl:template match="html">
                <xsl:apply-templates select="head"/>
              </xsl:template>
            
              ...
            
            </xsl:stylesheet>

            Comment


            • #7
              Das hat super funktioniert, vielen Dank

              Hast du auch noch eine zu folgendem: wenn ich eine XML Datei habe, wo Name-Value Paare drin stehen und eine XML Datei (die dynamisch auch per XSLT erzeugt wird) in der Names stehen. Abhängig von dem Name und dem dazugehörigen Value, möchte ich in der XML Datei etwas einfügen?

              Also zb ein Produktblatt welches per XSLT erzeugt wird/wurde. In einer anderen XML Datei stehen die Produktnummern. Abhängig vom Produktblatt, möchte ich nun die entsprechende ID einfügen. In welche Richtung müsste ich da suchen?

              Comment


              • #8
                Direktes Einfügen funktioniert so nicht, aber das Erzeugen neuer XML-Dokumente auf der Basis von bereits exstierenden. Dabei hilft die document()-Funktion. Beispiele sind im Forumsarchiv zu finden.

                Comment


                • #9
                  Vielen Dank, hat wunderbar funktioniert.

                  Comment

                  Working...
                  X