Sök…
Anmärkningar
Element- och attributnamn i XML kallas QNames (kvalificerade namn).
Ett QName består av:
- ett namnområde (en URI)
- ett prefix (ett NCName, NC eftersom det inte innehåller någon kolon)
- ett lokalt namn (ett NCName)
Endast namnområdet och det lokala namnet är relevanta för att jämföra två QN-namn. Prefixet är bara en proxy till namnområdet.
Namnområdet och prefixet är valfritt, men namnområdet är alltid när det finns prefixet (detta säkerställs på syntaktisk nivå, så det kan inte göras fel).
Den lexikala representationen av ett QName är prefix:local-name
. Namnytan är bunden separat med de speciella xmlns:...
-attributen (påminnelse: attribut som börjar med xml är reserverade i XML).
Om prefixet är tomt, används ingen kolon i den lexikala representationen av QName, som bara innehåller det local-name
. QNames med ett tomt prefix har antingen inget namnutrymme (om inget standardnamnområde är i omfattning) eller finns i standardnamnområdet.
Bind ett prefix till ett namnområde
Ett namnområde är en URI, men för att undvika verbositet används prefix som proxy.
I följande exempel är prefixet my-prefix
bundet till namnområdet http://www.example.com/my-namespace
med hjälp av specialattributet xmlns:my-prefix
( my-prefix
kan ersättas med något annat prefix) :
<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
<!-- the element my-prefix:foo
lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>
Frånvaro av namnutrymme
I XML lever element- och attributnamn i namnutrymmen.
Som standard finns de inte i något namnområde:
<?xml version="1.0"?>
<foo attr="value">
<!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>
Irrelevans av prefix
Dessa två dokument är semantiskt ekvivalenter, eftersom namnområden är viktiga, inte prefix.
<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>
<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>
Standard namnutrymme
Standardnamnområdet är namnområdet som motsvarar frånvaron av något prefix. Det kan deklareras med det speciella attributet xmlns
.
<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
<!-- the element foo is in the namespace
http://www.example.com/my-namespace -->
</foo>
Om inget standardnamnområde anges är namnen utan prefix i inget namnutrymme.
Attributnamn utan prefix
Element och attribut uppträder annorlunda med avseende på standardnamnområden. Detta är ofta källan till förvirring.
Ett attribut vars namn inte har något prefix bor i inget namnområde, även när ett standardnamnområde är inom räckvidd .
<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
<!-- The attribute attr is in no namespace, even though
a default namespace is in scope. The element foo,
however, is in the default namespace. -->
</foo>
Omfattning av namnutrymmebindningar
En namnutrymmebindning (speciell xmlns
eller xmlns:...
attribut) är i omfattning för alla ättlingar till det bifogande elementet, inklusive detta element.
<?xml version="1.0"?>
<root>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
</my:element>
<my:element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2 -->
</my:element>
</root>
Bindningen kan åsidosättas i ett kapslat element (detta påverkar dock läsbarheten):
<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:first-child-element/>
<my:child-element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2,
including for the element my:child-element -->
</my:child-element>
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:last-child-element/>
</my:element>
Det är mycket vanligt att deklarera alla namnutrymmebindningar i rotelementet, vilket förbättrar läsbarheten.
<?xml version="1.0"?>
<root
xmlns="http://www.example.com/default-namespace"
xmlns:ns1="http://www.example.com/ns1"
xmlns:ns2="http://www.example.com/ns2">
<ns1:element>
<ns2:other-element/>
</ns1:element>
</root>