Gunnar Bittersmann: Namensraumangaben in Ausgabe

Hello out there!

Ich transformiere eine XML-Datei mit mehreren Namenräumen, die auch im XSLT-Stylesheet angegeben sind. Im XSLT steht

<xsl:output  
  xsl:method="xml"  
  xsl:encoding="UTF-8"  
  xsl:omit-xml-declaration="yes"  
  xsl:standalone="yes"  
  xsl:doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"  
  xsl:doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"  
  xsl:indent="yes"  
  xsl:media-type="text/html"  
/>

In der Ausgabe stehen nun im Start-Tag des Wurzelelements sämtliche verwendeten Namensräume (außer dem XSLT-Namensraum). Es braucht aber lediglich der XHTML-Namensraum dort zu stehen. Wie bekomme ich die anderen weg?

See ya up the road,
Gunnar

--
“Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  1. Hallo Gunnar,

    In der Ausgabe stehen nun im Start-Tag des Wurzelelements sämtliche verwendeten Namensräume (außer dem XSLT-Namensraum). Es braucht aber lediglich der XHTML-Namensraum dort zu stehen. Wie bekomme ich die anderen weg?

    Ungetestet, aber so scheint laut Spezifikation so zu gehen:

    <xsl:[link:http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#stylesheet@title=stylesheet] exclude-result-prefixes="prefix1 prefix2">

    Tim

    1. Hello out there!

      Ungetestet, aber so scheint laut Spezifikation so zu gehen:

      Getestet, geht*. Danke.

      Wenn man weiß, wie’s heißt findet man’s auch in der Spec: [XSLT §7.1.1]

      *Hm, geht teilweise. Wenn ich „Der vorgegebene Namensraum (wie durch xmlns deklariert) kann durch Einbindung von #default in die Liste der Namensraum-Präfixe als ausgeschlossener Namensraum gekennzeichnet werden“ richtig deute, sollte bei

      <xsl:stylesheet version="1.0"  
        exclude-result-prefixes="#default foo"  
        xmlns="http://www.w3.org/1999/xhtml"  
        xmlns:foo="http://example.net/foo#"  
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
      
      >
      
      

      auch der XHTML-Namensraum nicht im Ergebnis stehen; tut es aber. Mein Fehler oder der des Prozessors?

      (Entgegen meinem OP brauch ich den XHTML-Namensraum nun doch nicht im Ergebnis, weil nicht die gesamte XHTML-Ressource durch XSLT erzeugt wird, sondern nur ein Teil davon.)

      See ya up the road,
      Gunnar

      --
      “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      1. Hallo,

        *Hm, geht teilweise. Wenn ich „Der vorgegebene Namensraum (wie durch xmlns deklariert) kann durch Einbindung von #default in die Liste der Namensraum-Präfixe als ausgeschlossener Namensraum gekennzeichnet werden“ richtig deute, sollte bei

        <xsl:stylesheet version="1.0"

        exclude-result-prefixes="#default foo"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:foo="http://example.net/foo#"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

        
        >   
        > auch der XHTML-Namensraum nicht im Ergebnis stehen; tut es aber. Mein Fehler oder der des Prozessors?  
        >   
          
        Im XSLT 1.0 ist eher die der Spez. weil so missverständlich. wie auch immmer.  
          
        <?xml version="1.0" encoding="iso-8859-1"?>  
        <data xmlns="http://www.w3.org/1999/xhtml" xmlns:foo="http://example.net/foo#">  
         <text>blabla</text>  
         <foo:text>foo text</foo:text>  
        </data>  
        \------------------  
        <?xml version="1.0" encoding="iso-8859-1"?>  
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://example.net/foo#" xmlns:bar="http://www.w3.org/1999/xhtml" exclude-result-prefixes="bar foo">  
        <xsl:template match="/">  
        <html>  
        <head>  
         <title>Untitled</title>  
        </head>  
          
        <body>  
        <h1>Text</h1>  
        <p><xsl:value-of select="bar:data/bar:text" /></p>  
        <p><xsl:value-of select="bar:data/foo:text" /></p>  
        \--------------  
          
        also muss du anstatt den default-Namensraum einen non-null-Namesraum definieren. Das machst du im Beispiel mit "bar", wobei das eigentlich wichtige ist, dass ein Namensraum \_durch die URL\_ und nicht durch den Prefix bestimmt wird.  
          
        Grüße  
        Thomas
        
        1. Hello out there!

          also muss du anstatt den default-Namensraum einen non-null-Namesraum definieren.

          Auch dann schreibt der Prozessor den Null-Namensraum ins Ergebnis.

          Abhilfe kann ich schaffen, indem ich den XHTML-Namensraum auch mit Präfix verwende:

          <xsl:stylesheet version="1.0"  
            exclude-result-prefixes="html foo"  
            xmlns:html="http://www.w3.org/1999/xhtml"  
            xmlns:foo="http://example.net/foo#"  
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
          
          >  
          
            <xsl:namespace-alias stylesheet-prefix="html" result-prefix="#default"/>  
            <html:ol>  
              <xsl:for-each select="foo:bar">  
                <html:li>  
                  <xsl:value-of select="foo:baz"/>  
                </html:li>  
              </xsl:for-each>  
            </html:ol>  
          </xsl:stylesheet>
          

          Oder ich verzichte völlig auf den XHTML-Namensraum:

          <xsl:stylesheet version="1.0"  
            exclude-result-prefixes="foo"  
            xmlns:foo="http://example.net/foo#"  
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
          
          >  
          
            <ol>  
              <xsl:for-each select="foo:bar">  
                <li>  
                  <xsl:value-of select="foo:baz"/>  
                </li>  
              </xsl:for-each>  
            </ol>  
          </xsl:stylesheet>
          

          Funktioniert auch. Ist das ohne XHTML-Namensraum unsauber?

          See ya up the road,
          Gunnar

          --
          “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
          1. Hallo,

            also muss du anstatt den default-Namensraum einen non-null-Namesraum definieren.

            Auch dann schreibt der Prozessor den Null-Namensraum ins Ergebnis.

            Welcher Prozessor denn?

            Abhilfe kann ich schaffen, indem ich den XHTML-Namensraum auch mit Präfix verwende:

            [code lang=xml]<xsl:stylesheet version="1.0"
              exclude-result-prefixes="html foo"
              xmlns:html="http://www.w3.org/1999/xhtml"
              xmlns:foo="http://example.net/foo#"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

            <xsl:namespace-alias stylesheet-prefix="html" result-prefix="#default"/>
              html:ol

            auf diese Weise ist das eigentlich unnötig.

            Oder ich verzichte völlig auf den XHTML-Namensraum:
            Funktioniert auch. Ist das ohne XHTML-Namensraum unsauber?

            Ja, das ist sauber, ich dachte du das in deinem _xml_ "xhtml" als dafualt Namensraum. Wenn das nicht der Fall ist, bruachst du das gar nicht zu verwenden/anzugeben.

            Grüße
            Thomas

            1. Hello out there!

              Welcher Prozessor denn?

              libxslt 1.1.15, denke ich.

              Sowas sagt jedenfalls phpinfo. Außerdem "libexslt 1.1.15", was hat es damit auf sich?

              See ya up the road,
              Gunnar

              --
              “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
              1. Hallo,

                Welcher Prozessor denn?

                libxslt 1.1.15, denke ich.

                Dann/damit liegt es am Prozessor.

                Außerdem "libexslt 1.1.15", was hat es damit auf sich?

                Die Unterstützung bzw. Bibliothek für die exslt (http://www.exslt.org/) Funktionen.

                Grüße
                Thomas

                1. Hallo Thomas,
                  danke erstmal für deine Antworten.

                  libxslt 1.1.15, denke ich.
                  Dann/damit liegt es am Prozessor.

                  Wie könnte ich das durch einen anderen schicken? phpinfo für PHP4 listet neben libxslt 1.1.15 auch Sablotron 1.0.1 auf.

                  Bisher habe ich diesen PHP-Schipsel im Quelltext:

                  $rdf = new DOMDocument;  
                  $rdf->load('foo.rdf');  
                    
                  $xsl = new DOMDocument;  
                  $xsl->load('foo.xsl');  
                    
                  $proc = new XSLTProcessor;  
                  $proc->importStyleSheet($xsl);  
                  echo $proc->transformToXML($rdf);
                  

                  See ya up the road,
                  Gunnar

                  --
                  “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
                  1. Hallo,

                    danke erstmal für deine Antworten.

                    Bitte ;-)

                    Wie könnte ich das durch einen anderen schicken? phpinfo für PHP4 listet neben libxslt 1.1.15 auch Sablotron 1.0.1 auf.

                    Unter http://forum.de.selfhtml.org/archiv/2004/4/t77955/#m450495 wird so ein Script beschrieben.

                    Grüße
                    Thomas

                    1. Hello out there!

                      Unter http://forum.de.selfhtml.org/archiv/2004/4/t77955/#m450495 wird so ein Script beschrieben.

                      Was auch (fast) auf Anhieb funktionierte. (Nur transformieren nutzt wenig, wenn das Ergebnis nicht auch ausgegeben wird. ;-))

                      Den XHTML-Namensraum (ohne Präfix) wieder ins XSLT rein und '#default' wieder in den Wert des 'exclude-result-prefixes'-Attibuts und voilà: Sablotron schreibt den XHTML-Namensraum nicht mit in die Ausgabe.

                      Und löst auch noch gleich ein anderes Problem: libxslt sortiert falsch, nämlich die Umlaute hinter Z. Und lässt sich auch durch explizite Angabe von 'lang="de"' nicht überreden, die Umlaute richtig einzuordnen; Sablotron tut dies anstandslos.

                      See ya up the road,
                      Gunnar

                      --
                      “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)