Gerhard: Keine Anker in XHTML Strict?

Hallo!

Fehler: Zeichen "#" ist im Wert von Attribut "name" nicht erlaubt

Das sagt mir der Validator (XHTML 1.0 Strict) wenn ich einen Anker setzten möchte.

Gibt es da keine Anker mehr und muss man auf andere Methoden zurückgreifen?

Danke
lg Gerhard

  1. hi,

    Fehler: Zeichen "#" ist im Wert von Attribut "name" nicht erlaubt

    Das sagt mir der Validator (XHTML 1.0 Strict) wenn ich einen Anker setzten möchte.

    im name-attribut eines ankers hatte # auch schon in HTML nichts zu suchen, vergleiche http://de.selfhtml.org/html/verweise/projektintern.htm#anker

    Gibt es da keine Anker mehr und muss man auf andere Methoden zurückgreifen?

    üblicherweise springt man einfach die ID an, mit der irgendein beliebiges element ausgezeichnet wurde.

    beispiel:

    <h1 id="bespringMich">überschrift</h1>

    <a href="#bespringMich">überschrift bespringen *lechz*</a>

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      im name-attribut eines ankers hatte # auch schon in HTML nichts zu suchen, vergleiche http://de.selfhtml.org/html/verweise/projektintern.htm#anker

      Doch, doch. Das ist eine Neuerung in XML.
      Im name-Attribut des a-Elements in HTML darf ein # vorkommmen. Das ist ein bekannter Fehler in SELFHTML (wird in 8.1.1 behoben sein).
      http://www.w3.org/TR/html401/struct/links.html#adef-name-A
      http://www.w3.org/TR/html401/types.html#type-cdata
      Natürlich ist # in <a name="..."> trotzdem sinnlos, schließlich unterliegt eine URI, die auf diesen Anker zeigt, den allgemeinen Regeln von URIs, und da ist <a href="#bla#blub"> ungültig. Aus der Sicht von HTML 4 ist es aber erlaubt. Letztlich eine Spitzfindigkeit, es geht aber um ein generelles Missverständnis, man denke an die Diskussionen um <input name="blub[]">: Das name-Attribute in HTML fordert meist CDATA und nur in Einzelfällen NAME als Inhalt. Auch SELFHTML irrte in dem Punkt. Letztlich ist den Thesen von SELFHTML zuzustimmen (»Verwende höchstens A-Z, 0-9, Punkt, Strich und Unterstrich«), aber nicht aus den angeführten Gründen.

      Mathias

      1. hi,

        http://www.w3.org/TR/html401/struct/links.html#adef-name-A

        Unter dem Link zu CDATA steht:
        "For some HTML 4 attributes with CDATA attribute values, the specification imposes further constraints on the set of legal values for the attribute that may not be expressed by the DTD."

        Ein solches "further constraint", eine weitere Einschränkung, steht an der Stelle auf die du oben verlinkt hast:
        "Note that this attribute shares the same name space as the id attribute."

        Wenn wir dort dann dem Link zu id folgen, steht dort:
        "id = name",

        wobei unter der name-Verlinkung dann wieder folgendes zu finden ist:
        << ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods ("."). >>

        Also ist m.E. ein # im name-Attribut eines Links auch in HTML 4.01 nicht erlaubt - auch wenn das zu den Sachen gehört, die nicht in der DTD hinterlegt werden können, und die somit der Validator auch nicht zu erkennen in der Lage ist.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Unter dem Link zu CDATA steht:
          "For some HTML 4 attributes with CDATA attribute values, the specification imposes further constraints on the set of legal values for the attribute that may not be expressed by the DTD."

          Ein solches "further constraint", eine weitere Einschränkung, steht an der Stelle auf die du oben verlinkt hast:
          "Note that this attribute shares the same name space as the id attribute."

          Das bedeutet zunächst einmal nur, dass man nicht id="blub" und name="blub" an zwei verschiedenen Elementen benutzen darf.
          Dieser Absatz, den du als further constraint liest, begrenzt aber nicht ausdrücklich die zwei Sätze vorher definierte Regel »CDATA für den name-Attributwert beim a-Element«. Das kann man natürlich hineininterpretieren, aber <a name="ö"> ist in HTML 4 ohne tiefergehende Exegese gemäß der natürlichsprachigen Definition erlaubt - inwiefern die Thematik des gleichen Namensraums die erlaubten Attributwerte begrenzt, leuchtet mir nicht ein.

          Also ist m.E. ein # im name-Attribut eines Links auch in HTML 4.01 nicht erlaubt - auch wenn das zu den Sachen gehört, die nicht in der DTD hinterlegt werden können, und die somit der Validator auch nicht zu erkennen in der Lage ist.

          Natürlich hätte es in der DTD ausgedrückt werden können. Ich nehme an, dass die Autoren der Spezifikation den eindeutigsten Weg gewählt haben. Hätten Sie für name bei a ausdrücklich ID gewollt, hätten Sie ID genommen (wollten Sie es? »The value of this attribute must be a unique anchor name« weist mehr oder weniger darauf hin, wenn man das als »dokumentweit eindeutig« versteht). Falls das Widersprüche gegeben hätte (weil dafür das id-Attribut reserviert ist und somit <a name="bla" id="bla"> problematisch gewesen wäre), hätten sie immer noch NAME nehmen können, für das ja ausdrücklich dieselben Syntaxregeln wie für ID gelten. (Die Einschränkung auf »unique anchor name« müsste dann wie jetzt natürlichsprachig ausgedrückt werden, weil mehrere <a name="bla"> sonst qua menschenlesbarer Spezifikation erlaubt wären.)
          Dann gibt es noch ganz offensichtliche Gründe: name bei a war schon in HTML 3.2 als CDATA (fehl)definiert. Wenn sie die Kontinuität bewahren wollten, konnten sie an der Definition nichts ändern, sondern nur <a name="..."> für Anker durch die id-Neudefinition komplett obsolet machen. Dann wäre es aber inkonsistent, wenn sie name als CDATA hinterrücks auf ID eingeschränken würden.

          Mathias

          1. Wenn wir dort dann dem Link zu id folgen, steht dort:
            "id = name",

            (http://www.w3.org/TR/html401/struct/global.html#adef-id)

            Ups, das habe ich ganz missachtet.
            id ist vom Typ NAME? Das muss ein Fehler sein, sonst wäre der Typ ID ja überflüssig. Natürlich gilt für beide dieselbe syntaktische Einschränkung, aber gemäß der http://www.w3.org/TR/html401/index/attributes.html=Attributreferenz ist id vom Typ ID. Auf dieser Annahme beruhen diese Aussagen:

            Hätten Sie für name bei a ausdrücklich ID gewollt, hätten Sie ID genommen (...) Falls das Widersprüche gegeben hätte (...), hätten sie immer noch NAME nehmen können

            Mathias

            1. Hi,

              id ist vom Typ NAME?

              1. http://www.w3.org/TR/html401/sgml/dtd.html#coreattrs

              2. steht dort name, nicht NAME. ;-) Kann sein, daß HTML "name" als Sammeltyp für ID und NAME benutzt.

              Hätten Sie für name bei a ausdrücklich ID gewollt, hätten Sie ID genommen (...)

              Nein, hätten sie nicht können.

              Nur ein Attribut pro Element darf vom Typ ID sein - und das ist ja schon das id-Attribut. (ich such jetzt aber nicht die Stelle raus, wo das steht, steht aber definitiv irgendwo - war glaub ich im SGML-Papier, das ich eh nicht verlinken kann, da das Ding ja nicht frei zugänglich ist).
              Sie hätten aber statt CDATA den Typ NAME oder NMTOKEN wählen können (so wie es bei XHTML dann geschehen ist mit NMTOKEN).

              Das Argument mit #bla#blubb als ungültige URL zieht übrigens gar nicht - das # im name müßte - so wie das "ö", das Du als zulässig anführst - schlicht und einfach urlcodiert in der URL auftauchen, also #bla%23blubb

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hallo,

                Sie hätten aber statt CDATA den Typ NAME oder NMTOKEN wählen können (so wie es bei XHTML dann geschehen ist mit NMTOKEN).

                Aha. Habe ich doch in meinem Posting geschrieben.

                Mathias

  2. Ich bin so blöd.
    Natürlich muss man in der Ankerdefinition keine # schreiben.
    lg Gerhard