frankx: Namensraumnamen, was sagt die URI oder URN?

Hallo,

bisher kapiert zu glauben habe ich, dass Namenssräume es erlauben, Elemente mit gleichen tag-namen aus unterschiedlichen Zusammenhängen auseinander zu halten.

Also buch:titel von dvd:titel.

Definiert wir es im Rootelement (?) oder Elternelement, zB. mit

<produkt xmlns:buch="urn:unifomer_resource_name">

oder

<produkt xmmlns:dvd="http:exmample.org/schema">

Ich kapier nicht, was der URI (ob als URN oder URL) denn besagt.

Der Verweis auf eine DTD verweist auf die Datei für die Validierungsregeln, der Verweis auf ein XSL-Dokument oder CSS bindet die Quelle für die Darstellung ein.

Was aber sagt der URN beim Namespace? Wo sucht dann der XML-Parser nach was und macht was damit?

Dank und Gruß, frankx

  1. bisher kapiert zu glauben habe ich, dass Namenssräume es erlauben, Elemente mit gleichen tag-namen aus unterschiedlichen Zusammenhängen auseinander zu halten.

    frankx,
    Soweit richtig.

    <produkt xmlns:buch="urn:unifomer_resource_name">

    Damit ist das Element "produkt" aber nicht aus dem Namensraum "urn:unifomer_resource_name".

    Dazu müsste es so
       <produkt xmlns="urn:unifomer_resource_name">
    oder so
       <buch:produkt xmlns:buch="urn:unifomer_resource_name">
    notiert werden.

    Ich kapier nicht, was der URI (ob als URN oder URL) denn besagt.

    Der macht das Element "produkt" aus dem Namensraum "urn:unifomer_resource_name" im Web eindeutig zu "urn:unifomer_resource_nameprodukt".

    (Good practice dürfte es sein, Namensraum-URIs mit "/" oder "#" enden zu lassen.)

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Hallo Gunnar,

      vielen Dank.

      Der macht das Element "produkt" aus dem Namensraum "urn:unifomer_resource_name" im Web eindeutig zu "urn:unifomer_resource_nameprodukt".

      Ja, bzw. die namensräume buch der url http://meinserver/buch und dvd der url http://meinserver/dvd.

      Aber was bewirkt diese Benenunng. Verweisen die URLs auf ein Verzeichnis, in dem etwas stehen sollte, und wenn ja was. Ja wohl kaum eine index.htm (;-); DTD und XLS und CSS verweisen ja immer auf Dateien, die da auch liegen sollten, wo sie angegeben sind.

      Gruß, frankx

      1. Hallo,

        um die Frage ohne Spezifikation und Theorie zu beantworten:

        Aber was bewirkt diese Benenunng. Verweisen die URLs auf ein Verzeichnis, in dem etwas stehen sollte, und wenn ja was.

        »There are two schools of thought about XML namespace names: (1) the name serves purely to distinguish otherwise-identical XML element names, and (2) the names leads to documentation, schema, and other information about the elements.«
        (http://www.taguri.org/)

        emu

      2. Hallo,

        Aber was bewirkt diese Benenunng. Verweisen die URLs auf ein Verzeichnis, in dem etwas stehen sollte, und wenn ja was. Ja wohl kaum eine index.htm (;-); DTD und XLS und CSS verweisen ja immer auf Dateien, die da auch liegen sollten, wo sie angegeben sind.

        Ein Namensraum ist nichts anderes als eine Sammlung von Namen die über eine URI eindeutig identifizierbar sind (da URIs (und/oder auch URNs) eindeutig sind) und die in XML-Dokumenten als Name für Elementtypen und Attribute genutzt werden.

        Die URI die einen Namensraum definiert ist lediglich eine formale Bezeichnung und muss nicht auf eine real existierende Ressource verweisen. Es ist auch  nicht nötig, dass eine existierende Ressource die verwendete Syntax im Dokument beschreibt.

        Grüße
        Thomas

        1. Moin!

          Aber was bewirkt diese Benenunng. […]

          Die URI die einen Namensraum definiert ist lediglich eine formale Bezeichnung und muss nicht auf eine real existierende Ressource verweisen. Es ist auch  nicht nötig, dass eine existierende Ressource die verwendete Syntax im Dokument beschreibt.

          Da fällt mir ein, was frankx evtl. auch interessieren dürfte: Wie kann ich denn ein XML-Dokument mit Namensräumen validieren? Gibt es einen „Trick“, so etwas wie eine DTD (Schema, RelaxNG, …), die die Elemente meines Namensraumes definiert, anzugeben oder ist das in der Tat nur eine rein formale Angelegenheit?

          Viele Grüße,
          Robert

          1. Hallo,

            Da fällt mir ein, was frankx evtl. auch interessieren dürfte: Wie kann ich denn ein XML-Dokument mit Namensräumen validieren? Gibt es einen „Trick“, so etwas wie eine DTD (Schema, RelaxNG, …), die die Elemente meines Namensraumes definiert, anzugeben oder ist das in der Tat nur eine rein formale Angelegenheit?

            Sratt langer Rede: http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm

            Grüße
            Thomas

            1. Hallo nochmal,

              besten Dank für die Hinweise. Unter http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm findet sich, dass "... das Präfix nur ein Stellvertreter (Abkürzung) der Namensraum-URI ist."

              Vielleicht liegt mein Verständnisproblem in der Verwendung der Namensräume. DTD könnnen selbige nicht "erkennen", aber mit DOM, SAX und auch XSLT (? in http://www.rpbourret.com/xml/NamespacesFAQ.htm findet sich dazun nix, also vermutlich nicht?), kann ich entsprechend der Namensraumzugehörigkeit dann enstprechend filtern und die Ausgabe beeinflussen? Oder in welcher Anwendung findet sich der wesentliche Nutzen, des auseinanderhaltens der Elemente? Könnte ich mit XSLT dann die Namen der Server server:name rot ausgeben, die der Personen personen:name blau zB., oder mit PHP und DOM oder SAX eine Liste lediglich der Servernamen ausspucken lassen und das anhand der Namespace URI (also entweder "http://irgendwasmitserver" oder "urn:auswasmitserver") filtern?

              Dank und Gruß,

              Frankx

              1. Hallo,

                besten Dank für die Hinweise. Unter http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm findet sich, dass "... das Präfix nur ein Stellvertreter (Abkürzung) der Namensraum-URI ist."

                Vielleicht liegt mein Verständnisproblem in der Verwendung der Namensräume.

                Gehen wir dann etwas mehr ins Detail:
                --------------------------------------------------------------------
                Nehmen wir das Beispiel mit dem Titel-Element:

                  
                <buch>  
                   <titel>Ratgeber</titel>  
                   <autor>  
                      <titel>Dr.</titel>  
                      <vorname>Peter</vorname>  
                      <nachname>Klug</nachname>  
                    </autor>  
                </buch>  
                
                

                Für den XML-Parser gibt es keinen Unterschied zwischen den zwei Titel-Elementen, obwohl beide unterschiedliche Bedeutung haben. Die beste Lösung wäre, wenn für jedes Element im Dokument ein eindeutiger Name gefunden werden könnte.
                Namensräume in XML dienen dazu, solche Mehrdeutigkeiten in XML-Dokumenten zu
                vermeiden und Element- und Attributnamen eindeutig zu benennen.

                Wie können wir also unsere Elemente eindeutig benennen? Es wäre möglich, dies in der folgenden Form zu tun:

                  
                <buch:buch>  
                   <buch:titel>Ratgeber</buch:titel>  
                   <buch:autor>  
                      <person:titel>Dr.</person:titel>  
                      <person:vorname>Peter</person:vorname>  
                      <person:nachname>Klug</person:nachname>  
                   </buch:autor>  
                </buch:buch>  
                
                

                Hier haben wir Elementen, die sich auf eine Person beziehen, einen Präfix mit dem Namen »person« und Elementen die sich auf das Buch beziehen, einen Präfix mit dem Namen »buch« zugewiesen. Somit erhalten wir zwei Gruppen von Elementen und wir können sofort sagen, welche Elemente in die eine und welche in die andere Gruppe gehören. Jede diese Gruppen bildet einen Namensraum und das jeweilige Präfix ist das so genannte Namensraum-Präfix.
                Damit haben wir zwar das Problem der Mehrdeutigkeit in diesem Beispiel behoben, aber wir haben noch immer nicht die Sicherheit, dass unsere Elemente eindeutig gekennzeichnet sind, denn andere Autoren könnten ebenso diese Präfixe für ihre Elemente benutzen.

                Um auch dieses Problem zu lösen, können wir bestimmen, dass für diese Präfixe ein URI als Name genutzt werden soll. Da URIs eindeutig sind, würden wir also das Problem damit umgehen. Und so könnte dann eines unserer Elemente in einem XML-Dokument notiert werden:
                http://www.meinedomain.de/person/:titelDr.</http://www.meinedomain.de/
                person/:titel>
                Aber in XML darf ein XML-Name das Zeichen »/«nicht enthalten, und dieses hätten wir in einer URI, womit unsere Dokumente nicht mehr wohlgeformt wären.
                Was wir also benötigen, ist eine Kombination von beidem, einerseits die Möglichkeit der Verwendung von eindeutigen URIs, anderseits die Möglichkeit Präfixe zu verwenden. Und genau diese Kombination bietet das Namensraumkonzept von XML.

                Alle Namensräume, die in einem XML-Dokument verwendet werden, müssen im Dokument deklariert werden. Dazu wird dem Namensraum-Präfix der URI des Namensraums zugewiesen. Ein Element oder Attribut aus dem Namensraum wird dann über das Namensraum-Präfix referenziert, das Namensraum-Präfix dient dabei als Abkürzung der URI.

                Um Namensräume in einem XML-Dokument nutzen zu können, müssen so genannte
                qualifizierte Namen als Element- oder Attributnamen verwendet werden. Ein qualifizierter Namen besteht aus dem Präfix und dem lokalen Teil. Das Präfix stellt den Namensraum-Präfix dar und der lokale Teil ist der ursprüngliche Elementname. Intern ersetzt der XML-Parser den Namensraum-Präfix durch den Namensraum selbst.
                --------------------------------------------------------------------

                DTD könnnen selbige nicht "erkennen", aber mit DOM, SAX und auch XSLT (? in http://www.rpbourret.com/xml/NamespacesFAQ.htm findet sich dazun nix, also vermutlich nicht?), kann ich entsprechend der Namensraumzugehörigkeit dann enstprechend filtern und die Ausgabe beeinflussen?

                Ja, kannst du. DOM, SAX und auch XSL bieten möglichkeiten dafür mit Namensräumen zu arbeiten.
                z.B.
                http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#local_name
                und
                http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#namespace_uri

                Oder in welcher Anwendung findet sich der wesentliche Nutzen, des auseinanderhaltens der Elemente?

                Dort z.B. wo man fremdes XML in sein eigens integriert (Srichwort z.B. content-syndication) und wo man nicht sicher sein kann, welche Elemente in dem fremden XML vorkommen können.

                »»Könnte ich mit XSLT dann die Namen der Server server:name rot ausgeben, die der Personen personen:name blau zB., oder mit PHP und DOM oder SAX eine Liste lediglich der Servernamen ausspucken lassen und das anhand der Namespace URI (also entweder "http://irgendwasmitserver" oder "urn:auswasmitserver") filtern?

                Könntest du.
                Ein Beispiel mit verschiedenen Namensräumen und XSL findest du z.B. unter http://forum.de.selfhtml.org/archiv/2006/1/t121479/#m781896

                Grüße
                Thomas

                1. Hallo Thomas und besten Dank,

                  das scheint mir die Sache schon zu entwirren. Dank auch für weiterführende Links, werd ich studieren.

                  Dort z.B. wo man fremdes XML in sein eigens integriert (Srichwort z.B. content-syndication) und wo man nicht sicher sein kann, welche Elemente in dem fremden XML vorkommen können.

                  Was aber logscheirweise heißt, dass ein URN als URI garnicht sinnvoll ist, da ich mit urn:meineaausgeachter-urn nicht zwangsläufig einen einzigartigen Identifikator hätte? Mit "http://www.meinedomain.xy//meinpfad" habe ich aber die Möglichkeit, weil sich jeder an die Konvention hält, da nicht "http://www.deinemdomain.xy" reinzuschreiben. Im Gegenzug kann ich aber auch eigene Abkürzungen für allgemeine Namensräume erfinden, oder ist dass danebengedacht undoder sinnfrei? Also: statt  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" auch xmlns:unfug="http://www.w3.org/1999/XSL/Transform" definieren?

                  Dank und Gruß,

                  Frankx

                  1. frankx,

                    nicht "http://www.deinemdomain.xy"

                    sondern bspw. "http://www.deinemdomain.example" oder "http://www."http://www.deinemdomain.example.net". [RFC2606] Ein selbst ausgedachter Domainname könnte wirklich existieren und sich hinter derm URI unangenehmer oder gar verbotener Inhalt befinden.

                    Im Gegenzug kann ich aber auch eigene Abkürzungen für allgemeine Namensräume erfinden, oder ist dass danebengedacht undoder sinnfrei?

                    Beides. ;-)

                    Also: statt  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" auch xmlns:unfug="http://www.w3.org/1999/XSL/Transform" definieren?

                    Ja, wenn du dann <unfug:stylesheet …>, <unfug:template …>, … schreibst.

                    Genauso kannst du xmlns="http://www.w3.org/1999/XSL/Transform" deklarieren und dann <stylesheet …>, <template …>, … schreiben.

                    Du kannst auch in deinem XSLT ein andere Kürzel für Namensräume verwenden als in dem Dokument, was damit transformiert wird; nur die URIs müssen gleich sein.

                    Live long and prosper,
                    Gunnar

                    --
                    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                    1. Hallo,

                      Genauso kannst du xmlns="http://www.w3.org/1999/XSL/Transform" deklarieren und dann <stylesheet …>, <template …>, … schreiben.

                      Damit hätte er bestimmt Probleme, denn so würden auch alle anderen Elemente, also auch die literalen Ergebniselemente (sofern er für sie keinen Namensraum definiert) in diesem default Namensraum fallen, was sein XSLT gleich ungütig machen würde.

                      Grüße
                      Thomas

                      1. sofern er für sie keinen Namensraum definiert

                        Thomas, sagte ich das nicht?

                        Nein, tat ich nicht; dein Hinweis war natürlich richtig.

                        Live long and prosper,
                        Gunnar

                        PS. BTW, du klempst. ;-) Die Forumsoftware erkennt Zitate des Vorposters an der Zeichenkette "»» ", nicht an "»»".

                        --
                        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                  2. Hallo,

                    Dort z.B. wo man fremdes XML in sein eigens integriert (Srichwort z.B. content-syndication) und wo man nicht sicher sein kann, welche Elemente in dem fremden XML vorkommen können.

                    Was aber logscheirweise heißt, dass ein URN als URI garnicht sinnvoll ist, da ich mit urn:meineaausgeachter-urn nicht zwangsläufig einen einzigartigen Identifikator hätte?

                    Das könnte zutreffen. Kommt darauf an ob du eine registririerte URN-Namensraum hast oder nicht.

                    Diese Frage hatten wir sch lange nicht mehr:
                    http://forum.de.selfhtml.org/archiv/2001/5/t23490/#m122662

                    Die Situation wird gut in den Punkten 2.1 bis 2.3 im http://www.ietf.org/rfc/rfc3305.txt beschrieben. (oder zum besser Lesen in: http://www.w3.org/TR/uri-clarification/ Punkt 1.1 bis 1.3)

                    Grüße
                    Thomas

                    Mit "http://www.meinedomain.xy//meinpfad" habe ich aber die Möglichkeit, weil sich jeder an die Konvention hält, da nicht "http://www.deinemdomain.xy" reinzuschreiben. Im Gegenzug kann ich aber auch eigene Abkürzungen für allgemeine Namensräume erfinden, oder ist dass danebengedacht undoder sinnfrei? Also: statt  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" auch xmlns:unfug="http://www.w3.org/1999/XSL/Transform" definieren?

                    Dank und Gruß,

                    Frankx

            2. Moin!

              Da fällt mir ein, was frankx evtl. auch interessieren dürfte: Wie kann ich denn ein XML-Dokument mit Namensräumen validieren? Gibt es einen „Trick“, so etwas wie eine DTD (Schema, RelaxNG, …), die die Elemente meines Namensraumes definiert, anzugeben oder ist das in der Tat nur eine rein formale Angelegenheit?

              Statt langer Rede: http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm

              Wie ich das sehe, heißt das wohl, dass sich in naher Zukunft jemand (ich?) einmal den verlinkten Artikel sowie die XML-Schema-Definition schnappen könnte, um daraus einen entsprechenden neuen Artikel zu schreiben ;-)

              Viele Grüße,
              Robert

              1. Hallo,

                Statt langer Rede: http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm

                Wie ich das sehe, heißt das wohl, dass sich in naher Zukunft jemand (ich?)

                Warum fragst du, wenn du die Antwort bereits kennst? ;)

                »»einmal den verlinkten Artikel sowie die XML-Schema-Definition schnappen könnte, um daraus einen entsprechenden neuen Artikel zu schreiben ;-)

                Selbstverständlich kannst du das machen, wir haben nichts dagegen, wenn du einen neuen Artikel zum Them schreibst! :-)

                Grüße
                Thomas

                1. Moin!

                  Statt langer Rede: http://aktuell.de.selfhtml.org/artikel/xml/namensraeume/index.htm

                  Wie ich das sehe, heißt das wohl, dass sich in naher Zukunft jemand (ich?)

                  Warum fragst du, wenn du die Antwort bereits kennst? ;)

                  Ich kenne aus meiner Sicht nur einen Teil der Antwort.

                  einmal den verlinkten Artikel sowie die XML-Schema-Definition schnappen könnte, um daraus einen entsprechenden neuen Artikel zu schreiben ;-)

                  Selbstverständlich kannst du das machen, wir haben nichts dagegen, wenn du einen neuen Artikel zum Them schreibst! :-)

                  Kein Problem, ein Tipp ist aktuell von mir noch in der redaktionellen Phase, da konnte ich schon einmal „lernen“, wie Selfhtml hinter den Kulissen funktioniert und ich bin gerne bereit, daran Anteil zu haben, aber vor den nächsten Semesterferien wird das wohl nichts :-| Falls also jemand schon vorher in dieser Richtung aktiv werden möchte, lasse ich gerne den Vortritt ;-)

                  Viele Grüße,
                  Robert