Вядома. Вось ён у пяць простых пункту кулі.
Рэкамендацыя прастор імёнаў XML вызначае спосаб адрозніваць дублікаты тыпу імёны элементаў і атрыбутаў. Такое дубляванне можа ўзнікнуць, напрыклад, у пераўтварэнні або ў дакуменце, які ўтрымлівае тыпы элементаў і атрыбутаў з двух розных DTD.
Прасторы імёнаў XML ўяўляе сабой набор тыпу імёны элементаў і атрыбутаў. Імёнаў ідэнтыфікуецца унікальным імем, якое з'яўляецца спасылкай URI. Такім чынам, любы тып элемента або імя атрыбуту ў прасторы імёнаў XML могуць быць адназначна вызначаны па-частка назваць два: імя свайго прасторы імёнаў XML і яго мясцовае назву. Гэта-частка сістэмы наймення два гэта адзінае, што вызначаны прасторы імёнаў XML рэкамендацыі.
XML Прасторы імёнаў аб'яўляюцца з атрыбутам XMLNS, якія можна звязаць з прэфікса прасторы імёнаў. Заява мае магчымасці для элемента, які змяшчае атрыбут і ўсіх яго нашчадкаў. Напрыклад:
<!-- Declares two XML namespaces. Their scope is the A and B elements. -->
<A xmlns:foo="http://www.foo.org/" xmlns="http://www.bar.org/">
<B>abcd</B>
</A>
Калі XML аб'яву прасторы імёнаў змяшчае прэфікс, вы спасылацца на тып элемента і імёны атрыбутаў у гэтай прасторы імёнаў з прэфіксам. Напрыклад:
<!-- A and B are in the http://www.foo.org/ namespace,
which is associated with the foo prefix. -->
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>abcd</foo:B>
</foo:A>
Калі XML аб'яву прасторы імёнаў, не ўтрымліваюць прэфікс прасторы імёнаў па змаўчанні прастора імёнаў XML і вы спасылацца на назвы тыпу элемента ў гэтай прасторы імёнаў без прэфікса. Напрыклад:
<!-- This is equivalent to the previous example but uses
a default namespace instead of the foo prefix. -->
<A xmlns="http://www.foo.org/">
<B>abcd</B>
</A>
Яны не з'яўляюцца панацэяй ад рака, яны не шлях да перамогі ў латарэі, і яны не з'яўляюцца непасрэднай прычынай міру ва ўсім свеце. Яны таксама не вельмі цяжка зразумець ці выкарыстаць. Дзве рэчы, якія прасторы імёнаў XML не выклікалі шмат блытаніны, далей мы будзем называць іх тут:
Прасторы імёнаў XML не тэхналогіі для злучэння XML-дакументаў, якія выкарыстоўваюць розныя DTD. Хоць яны могуць быць выкарыстаны ў такіх тэхналогій, яны не забяспечваюць самі.
URI спасылак, якія выкарыстоўваюцца ў якасці прасторы імёнаў XML імёны не гарантавана, каб паказаць на схемы, інфармацыю аб прасторы імёнаў, ці што-небудзь яшчэ - яны проста ідэнтыфікатары. URI спасылкі былі выкарыстаны проста таму, што URI, з'яўляюцца добра вядомай сістэмай для стварэння унікальных ідэнтыфікатараў. Нават не думайце аб спробе вырашыць гэтыя URI спасылак. (Падрабязней гл. пытанне 14,6).
Перш чым абмяркоўваць прасторы імёнаў XML, карысна абмеркаваць імёнаў у цэлым. У гэтым FAQ, мы будзем спасылацца на такія прасторы імёнаў, як традыцыйных імёнаў. Мы будзем называць імёнаў XML, як прасторы імёнаў XML. Слова імёнаў можа адносіцца да традыцыйных імёнаў або імёнаў XML, у залежнасці ад кантэксту, але ў цэлым адносяцца да прасторы імёнаў XML.
Традыцыйных імёнаў ўяўляе сабой набор з нуля або больш імёнаў, кожнае з якіх павінна быць унікальным у межах прасторы імёнаў і пабудаваны ў адпаведнасці з правіламі (калі такія маюцца) імёнаў. Напрыклад, імёны тыпаў элементаў у дакуменце XML насяляюць традыцыйных імёнаў, як і імёны табліц у рэляцыйнай базы дадзеных і імёны зменных класа ў клас Java. Традыцыйныя імёнаў таксама адбываюцца за межамі вобласці кампутарных навук - напрыклад, імёны людзей, можна разглядаць жыць у традыцыйных імёнаў, як можа назвы відаў.
Яны не перасякаюцца - гэта значыць, яны не звязаныя. З-за гэтага, імя ў адным традыцыйных імёнаў не сутыкаюцца з такім жа імем у розных традыцыйных імёнаў. Гэта ўласцівасць карысна для прыкладанняў, якія маюць некалькі набораў імёнаў. Прызначаючы кожнай набор імёнаў розных традыцыйных імёнаў, яны могуць дазволіць ж імя адбываецца ў кожны набор імёнаў, не асцерагаючыся сутыкнення.
Напрыклад, у наступным дакуменце XML, няма ніякага канфлікту паміж трыма рознымі відамі выкарыстання Значэнне імя.
<AuctionItem>
<Title Value="486Laptop"/>
<Category Value="Computers"/>
<Value>$100</Value>
</AuctionItem>
Гэта таму, што дакумент XML мае адзін традыцыйных імёнаў для імёнаў тыпу элемента і для кожнага тыпу элемента, адзін традыцыйных імёнаў для імёнаў атрыбутаў, якія прымяняюцца да гэтага тыпу элемента. Такім чынам, два імя, значэнне атрыбуту не канфлікт, таму што кожны з іх прызначаны розных традыцыйных імёнаў - першы атрыбут прасторы імёнаў для тыпу Назва элемента і другі атрыбут прасторы імёнаў для тыпаў элементаў катэгорыі. Акрамя таго, ні адно з значэнняў атрыбутаў імёнаў канфліктаў з імем тыпу элемента каштоўнасць, паколькі імёны тыпу элемента знаходзяцца ў традыцыйных імёнаў, якое з'яўляецца асобным ад атрыбуту прасторы імёнаў.
Іншыя прыклады прыкладанняў, якія выкарыстоўваюць некалькі традыцыйных імёнаў ўключаюць у сябе:
Java-класаў. У класе Java, ёсць адзін традыцыйных імёнаў для імёнаў зменных класа, адзін традыцыйных імёнаў для імёнаў метадаў, і, для кожнага метаду, адзін традыцыйных імёнаў для імёнаў зменных мясцовыя да гэтага метаду.
Рэляцыйных баз дадзеных. У рэляцыйнай базы дадзеных, ёсць адзін традыцыйных імёнаў для імёнаў табліц, а для кожнай табліцы, адна традыцыйных імёнаў для імёнаў Стоўбцаў ў гэтай табліцы.
Магчыма, самы распаўсюджаны (інфарматыка) выкарыстанне традыцыйных імёнаў з'яўляецца прадастаўленне кантэйнераў для набор ідэнтыфікатараў. Напрыклад, традыцыйныя прасторы імёнаў выкарыстоўваюцца для захоўвання імёнаў (ідэнтыфікатараў) тыпаў элементаў у дакуменце XML, імёны зменных класа ў клас Java, і назвы табліц у рэляцыйнай базы дадзеных. Традыцыйныя імёнаў карысныя ў гэтым дачыненні, таму што іх патрабаванне, што кожнае імя ў прасторы імёнаў быць унікальным. Такім чынам, калі новае імя (ідэнтыфікатар) дадаецца да прасторы імёнаў, унікальнасці ідэнтыфікатара можа быць праверана шляхам праверкі таго, што імя не існуе ў прасторы імёнаў.
(Майце на ўвазе, што толькі таму, што мноства аб'ектаў чэрпае свае імёны ад некаторых традыцыйных імёнаў не азначае, што гэтыя імёны адназначна ідэнтыфікаваць аб'екты. Напрыклад, два розных людзей могуць адны і тыя ж імя, як можна двума рознымі вузламі элемент у дрэва DOM, якія выкарыстоўваюць імёны тыпу элемента, як іх імёны. Для імёнаў у традыцыйных імёнаў для ідэнтыфікацыі аб'ектаў у мностве, аб'екты ў наборы павінны прыцягнуць іх імёны толькі ад імёнаў і імя не можа быць ужыты да больш чым аднаму аб'екту. На практыцы, імёны з аднаго традыцыйных імёнаў выкарыстоўваюцца толькі для ідэнтыфікацыі аб'ектаў у адзіны комплекс, у адваротным выпадку, дадатковая інфармацыя павінна захоўвацца аб тым, імёны якіх распаўсюджваецца на якіх мноства).
Прасторы імёнаў XML першапачаткова былі прызначаны для забеспячэння універсальных унікальных імёнаў для элементаў і атрыбутаў. На практыцы яны выкарыстоўваюцца ў XML-тэхналогій, калі унікальныя імёны неабходныя, напрыклад, для складаных імёнаў тыпаў у XML-схемы і імёны функцый у XQuery. Гэты раздзел прысвечаны першы выпадак, але большасць таго, што яна абмяркоўвае прымяняецца да шырокага выпадках.
Як прыклад таго, чаму прасторы імёнаў XML неабходна, разгледзець наступныя два XML-дакументаў:
<?xml version="1.0" ?>
<Address>
<Street>Wilhelminenstr. 7</Street>
<City>Darmstadt</City>
<State>Hessen</State>
<Country>Germany</Country>
<PostalCode>D-64285</PostalCode>
</Address>
and:
<?xml version="1.0" ?>
<Server>
<Name>OurWebServer</Name>
<Address>123.45.67.8</Address>
</Server>
Кожны дакумент выкарыстоўвае іншую мову XML і для кожнай мовы вызначае тып элемента адрасы. Кожны з гэтых тыпаў Адрас элемент адрозніваецца ад іншых - гэта значыць, кожны з іх мае розныя мадэлі зместу, іншага сэнсу, і інтэрпрэтуецца прымяненне ў розных шляху. Гэта не з'яўляецца праблемай да тых часоў, як гэтыя тыпы элементаў існуюць толькі ў выглядзе асобных дакументаў. Але што, калі мы хочам, каб выкарыстаць іх у тым жа дакуменце, напрыклад, спіс падраздзяленняў, іх адрасы, а таксама іх вэб-серверы? Як дадатак ведаць, якой тып адрасы элемента, гэта апрацоўка?
Адным з рашэнняў з'яўляецца проста перайменаваць адзін з тыпаў Адрас элемент - напрыклад, мы маглі б перайменаваць другі IP-адрас тыпу элемента. Аднак, гэта не карысна доўгатэрміновае рашэнне. Адна з надзей XML з'яўляецца тое, што людзі будуць стандартызацыі XML моў для розных прадметных абласцей і напісаць Модульны код для апрацоўкі гэтых моў. Па паўторнага выкарыстання існуючых моў і кодаў, карыстачы могуць хутка вызначаць новыя мовы і пісаць прыкладанні, якія апрацоўваюць іх. Калі мы пераназавем Другі элемент Адрас тыпу IP-адрас, Мы зламалі любы код, які чакае, што старую назву.
Лепшым адказам з'яўляецца прызначэнне кожнага мовы (уключаючы яго тып элемента адрасы) у іншую прастору імёнаў. Гэта дазваляе нам працягваць выкарыстоўваць назву адрас на любой мове, але адрозніваць два розных тыпу элемента. Механізм, з дапамогай якога мы робім гэта прасторы імёнаў XML. Напрыклад, наступны дакумент выкарыстоўвае прастору імёнаў XML адрозніваць два розных тыпу элемента з імем адрас.
<Department>
<Name>DVS1</Name>
<addr:Address xmlns:addr="http://www.tu-darmstadt.de/ito/addresses">
<addr:Street>Wilhelminenstr. 7</addr:Street>
<addr:City>Darmstadt</addr:City>
<addr:State>Hessen</addr:State>
<addr:Country>Germany</addr:Country>
<addr:PostalCode>D-64285</addr:PostalCode>
</addr:Address>
<serv:Server xmlns:serv="http://www.tu-darmstadt.de/ito/servers">
<serv:Name>OurWebServer</serv:Name>
<serv:Address>123.45.67.8</serv:Address>
</serv:Server>
</Department>
Першы элемент Адрас імя тыпу адносіцца да прасторы імёнаў http://www.tu-darmstadt.de/ito/addresses XML. Яна пашырылася (з двух частак) найменне "http://www.tu-darmstadt.de/ito/addresses" плюс "Адрас". (Пасля канвенцыі ў артыкуле Джэймсам Кларкам, запішам гэта як {} http://www.tu-darmstadt.de/ito/addresses адрас.) Другі элемент Адрас імя тыпу належыць http://www. tu-darmstadt.de/ito/servers прасторы імёнаў XML і разгорнутае імя {} http://www.tu-darmstadt.de/ito/servers адрас. Такім чынам, кожны пашырана імя унікальна, пасяджэнне патрабаванне, каб кожны тып элемента ў дакуменце XML мець ўнікальнае імя.
(Майце на ўвазе, што, прызначыўшы кожнаму імя Зварот да прасторы імёнаў XML, мы на самой справе змяніць назву на дзве часткі імя, якое складаецца з назвы прасторы імёнаў XML плюс назву адрас. Гэта азначае, што любы код, які прызнае толькі назва адрас будзе неабходна быць зменена, каб прызнаць новае імя частцы два. Аднак, гэта толькі павінна быць зроблена пасля таго, як двух частак (пашыраны імя) універсальна ўбачыць унікальныя. Дадатковыя звесткі аб адзінасці пашырэння імёнаў пытанне 12,16 ; Для атрымання дадатковай інфармацыі аб апрацоўцы пашырана імёны, глядзіце таксама пытанне 11,1).
Прасторы імёнаў XML выкарыстоўваюцца ў шэрагу кірункаў. Напрыклад:
Шматразовыя схем. Многія прамысловыя групы распрацавалі свае ўласныя XML-схем. Каб пазбегнуць сутыкнення з агульнымі назвамі ў іншых схемах, усе з іх прысвойваецца адзін або некалькі прастор імёнаў XML ў свае схемы. Як вынік, можна паўторна выкарыстоўваць элементы і атрыбуты, вызначаныя ў гэтых схем ў новых схемах, не асцерагаючыся канфліктаў імёнаў. Напрыклад, SVG, XHTML, XLink, MathML, і Dublin Core з'яўляюцца добрымі кандыдатамі для ўключэння ў іншыя мовы, паколькі яны забяспечваюць выразна пэўныя і шырока падтрымлiваюцца, элементаў і атрыбутаў (адпаведна) графіка, тэкст, спасылкі, матэматыка і метададзеныя.
Напрыклад, SVG выкарыстоўвае XLink для яе звёнаў. Наступны фрагмент (з рэкамендацыяй SVG) паказвае, HREF атрыбуту XLink, якая звязвае эліпса да хатняй старонцы W3C.
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="5cm" height="3cm" viewBox="0 0 5 3" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<desc>Example link01 - a link on an ellipse</desc>
<rect x=".01" y=".01" width="4.98" height="2.98"
fill="none" stroke="blue" stroke-width=".03"/>
<a xlink:href="http://www.w3.org">
<ellipse cx="2.5" cy="1.5" rx="2" ry="1" fill="red" />
</a>
</svg>
Extensible схем. Мовы, такія як XML-схем, DocBook, DITA, HL7, FIXML, і METS былі распрацаваны з пашыральнасцю на ўвазе. Іншымі словамі, мовы альбо месцах, дзе прыстасаваныя элементы як чакаецца, будуць уключаны або аўтары гэтых схем проста чакаць карыстальнікам змяняць іх для задавальнення сваіх патрэбаў. Напрыклад, лік кампаній выкарыстоўваюць XML-схем у якасці асновы для XML-на-рэляцыйнай базы дадзеных моў адлюстравання, дадаўшы, адлюстраванне інфармацыі як унутры XS: AppInfo элемент або як атрыбуты ў XS: элементы атрыбуту: элемент і XS.
Наступны фрагмент паказвае некаторыя з пашырэнняў выкарыстоўваецца Microsoft SQL Server 2005:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xs:annotation>
<xs:appinfo>
<sql:relationship name="CustomerOrderHeader"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
<sql:relationship name="OrderHeaderOrderDetail"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Customer" sql:relation="Sales.Customer" >
...
</xs:schema>
Звярніце ўвагу, што пашырэнне вызначаецца Microsoft выкарыстоўваць розныя прасторы імёнаў XML ад выкарыстоўванага XML-схем. Пакуль код, які апрацоўвае XML-схем (такіх, як правяральны парсер) ігнаруе элементы і атрыбуты з прасторы імёнаў XML не прызнаць, што код будзе працягваць працаваць, нават калі элементы і атрыбуты, вызначаныя па Microsoft прысутнічаюць.
Адвольныя XML плюс апрацоўкі XML. Існуе шырокі клас моў XML, якія ўключаюць адвольныя XML плюс некаторыя XML, што дае апрацоўкі інфармацыі. Два найбольш вядомых прыкладаў такога роду мовы XSLT і SOAP.
XSLT стыляў складаюцца з адвольных элементаў і атрыбутаў (якія былі скапіяваныя непасрэдна на выхадзе), а таксама элементы і атрыбуты мовы XSLT, якія вызначаюць, як пераўтварыць ўваходны дакумент.
SOAP дакументаў складаецца з канверта, загалоўка і цела. Канверт дзейнічае як кантэйнер для загалоўка і цела, загаловак змяшчае дадатковую інфармацыю (напрыклад, кантэкст паведамленні або апрацоўкі інфармацыі), і цела змяшчае само паведамленне. SOAP вызначае канверта, загаловак і элементаў кузава, у той час як карыстальнікі вызначыць змесціва загалоўка і цела. Напрыклад, наступны дакумент змяшчае SOAP-паведамленне, каб запытаць кошт акцый IBM. Звярніце ўвагу, што паведамленне (унутры мыла: тулава) выкарыстоўвае розныя імёнаў з элементаў SOAP.
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
<soap:Body>
<stock:GetPrice xmlns:stock="http://www.foo.org/stockprices">
<stock:Symbol>IBM</stock:Item>
</stock:GetPrice>
</soap:Body>
</soap:Envelope>
Без прасторы імёнаў XML, такія мовы, не маглі б існаваць. Гэта таму, што XML Прасторы імёнаў Адзіны спосаб адрозніць элементы і атрыбуты ў апрацоўцы XML з адвольнага XML. Калі прасторы імёнаў XML не выкарыстоўваецца, заўсёды будзе магчымасць сутыкнення паміж імёнамі ў адвольны XML і імёнаў у апрацоўцы XML.
Паўторна выкарыстоўваецца код. Кодэкса, які апрацоўвае XML павінен прызнаць, імёны элементаў і атрыбутаў. Паколькі XML Прасторы імёнаў дазваляюць напісаць такі код, не турбуючыся аб сутыкненнях элемента і імя атрыбуту, у выніку код можа быць паўторна выкарыстаны ў розных дадатках. Напрыклад, існуе плягін для адлюстравання SVG і MathML. Калі браўзэр сустракае элемент з SVG або MathML імёнаў, ён можа перадаваць апрацоўкі плагіна. Іншы клас шматразовага код XQuery выразы для выканання пэўных задач, такіх як атрыманне інфармацыі аб маршрутызацыі з паведамленняў SOAP.
Версіямі. XML Прасторы імёнаў часам выкарыстоўваецца, каб забяспечыць інфармацыю аб версіі. Гэта значыць, новых імёнаў выкарыстоўваецца, калі новая версія мовы вылучаецца, што не мае зваротнай сумяшчальнасці са старой версіяй. Таму што гэта прыводзіць новыя імёны для элементаў і атрыбутаў, няма неабходнасці турбавацца, што прыкладанні, прызначаныя для апрацоўкі старой версіі мовы няправільна працэсу дакумент, які адпавядае новай версіі. Замест гэтага, яны не прызнаюць новага прасторы імёнаў і альбо ігнараваць дакумент або вярнуць памылку. Гэта асабліва важна, калі элемента або імя атрыбуту застаецца тым жа (акрамя сваіх імёнаў), але мае розную семантыку. Для атрымання дадатковай інфармацыі аб прасторах імёнаў XML і кіравання версіямі, гл Прасторы імёнаў і версій па улікам Ogbuji.
Прастора імёнаў аснове праверкі. Імёнаў праверку на падставе Dispatch мова (NVDL) дазваляе карыстальнікам паказваць, як праверыць дакумент у адпаведнасці з XML-імёнаў элементаў і атрыбутаў. Асноўная ідэя ў тым, што дакумент разбіваецца на поддеревья, з элементамі і атрыбутамі ў кожным поддереве абмену аднаго прасторы імёнаў XML. Сцэнар NVDL то карты кожнага прасторы імёнаў XML ў схеме выкарыстоўваецца для праверкі элементаў і атрыбутаў у гэтай прасторы імёнаў.
Напрыклад, наступны дакумент XHTML змяшчае ўбудаваны Scalable Vector Graphics (SVG) дакумента:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg">
<head>
<title>XHTML with embedded SVG</title>
</head>
<body>
<p>Following this paragraph is an
SVG fragment that defines a circle.</p>
<svg:svg width="400" height="400" version="1.1">
<svg:circle cx="200" cy="200" r="100" />
</svg:svg>
</body>
</html>
Гэты дакумент не можа быць правераны на адпаведнасць схеме XHTML XHTML, паколькі не ўтрымлівае SVG: SVG-элемент, і ён не можа быць правераны з SVG-схемы, паколькі SVG не ўтрымлівае HTML элемент. Аднак, па асобнасці праверкі XHTML поддерево (мінус поддерево SVG) і поддерево SVG, можна вызначыць дзеянні ўсяго дакумента. Для атрымання дадатковай інфармацыі см. пытанне 9,2.
Прастора імёнаў-Aware пошукаў. У мовах, такіх як XQuery, можна шукаць па прасторы імёнаў элемента або атрыбуту. Адно з магчымых ужыванняў гэтага шукае усе дакументы, якія адхіляюцца ад пэўны стандарт. Напрыклад, выкажам здагадку, у вас ёсць база дадзеных дакументаў DocBook і хочаце знайсці ўсе дакументы, у якіх выкарыстоўваюцца элементы не вызначаны DocBook. Гэта можна зрабіць з наступнае выраз XQuery:
for $doc in collection("my_documents")
where some $element in $doc//element() satisfies
(fn:namespace-uri($element) ne "http://docbook.org/ns/docbook")
return $doc
Прасторы імёнаў XML ўяўляе сабой набор тыпу імёны элементаў і атрыбутаў. Сама калекцыя не мае значэння - на самой справе, разумным аргументам можна сцвярджаць, што прасторы імёнаў XML на самай справе не існуе, як фізічная або канцэптуальнымі сутнасцямі (гл. прастора імёнаў Міф № 1). Важна, імя прасторы імёнаў XML, які з'яўляецца спасылкай URI. Гэта дазваляе прасторы імёнаў XML, каб забяспечыць сістэма з двух частак імёнаў для тыпаў элементаў і атрыбутаў. Першая частка імя спасылкі URI выкарыстоўваецца для ідэнтыфікацыі прасторы імёнаў XML - прасторы імёнаў. Другая частка тыпу элемента або атрыбуту сама назва - лакальная частка, таксама вядомы як лакальнае імя. Разам яны складаюць разгорнутае імя.
Гэта-частка сістэмы наймення два гэта адзінае, што вызначаны прасторы імёнаў XML рэкамендацыі.
Колькасць
Гэта вельмі важны момант і крыніцай большай блытаніны, таму мы будзем паўтараць:
Рэкамендацыі XML NAMESPACES не вызначае нічога, акрамя двух частак сістэма наймення для тыпаў элементаў і атрыбутаў.
У прыватнасці, яны не забяспечваюць або вызначыць любое з наступных дзеянняў:
Спосаб зліцця двух дакументаў, якія выкарыстоўваюць розныя DTD. (Гл. пытанне 10,5).
Спосабу звязаць прасторы імёнаў XML-схемы і інфармацыі. (Гл. пытанне 14,6 і імёнаў Міф № 8.)
Спосаб праверкі дакументаў, якія выкарыстоўваюць прасторы імёнаў XML. (Гл. пытанне 7,6.)
Спосабу звязаць тып элемента або атрыбуту заявы ў DTD з прасторай імёнаў XML. (Гл. пытанне 7,2.)
XML Прасторы імёнаў калекцый імёны, і нічога больш. Гэта значыць, яны ўтрымліваюць імёны тыпаў элементаў і атрыбутаў, а не элементы або атрыбуты сябе. Напрыклад, разгледзім наступны дакумент.
<foo:A xmlns:foo="http://www.foo.org/">
<B foo:C="foo" D="bar"/>
</foo:A>
Імя тыпу элемента і імя атрыбуту C у http://www.foo.org/ імёнаў, таму што яны адлюстроўваюцца там Foo прэфікса. Элемент імя тыпу B і D імя атрыбуту не ў любым прасторы імёнаў XML, паколькі без прэфікса карты іх там. З іншага боку, элементы і B і C атрыбуты і D не ў любым прасторы імёнаў XML, нават калі яны фізічна ў межах http://www.foo.org/ дэкларацыі прасторы імёнаў. Гэта таму, што прасторы імёнаў XML ўтрымліваюць імёны, а не элементы або атрыбуты.
Прасторы імёнаў XML таксама не ўтрымліваюць вызначэння тыпаў элементаў або атрыбутаў. Гэта важнае адрозненне, так як многія людзі схільныя думаць аб прасторы імёнаў XML, як схемы, якія гэта не так. (Для атрымання дадатковай інфармацыі см. прастора імёнаў Міф № 8.)
(Для атрымання інфармацыі аб структуры прасторы імёнаў XML, гл прастора імёнаў Міф № 6.)
Колькасць
Калі тып элемента або імя атрыбуту, як канкрэтна не абвешчаныя ў прасторы імёнаў XML - гэта значыць, гэта без прэфікса і (у выпадку імёны тыпу элемента) не існуе па змаўчанні прастора імёнаў XML - тое, што імя не ў любым прасторы імёнаў XML. Калі вы хочаце, вы можаце думаць аб ім, як з пустой спасылкай URI, як яго імя, хоць і не "нулявы" прасторы імёнаў XML сапраўды існуе. Напрыклад, у наступным, элемент імя тыпу B і імёны атрыбутаў С і Е не ў любым прасторы імёнаў XML:
<foo:A xmlns:foo="http://www.foo.org/">
<B C="bar"/>
<foo:D E="bar"/>
</foo:A>
Для атрымання дадатковай інфармацыі пра без прэфікса імёнаў атрыбутаў і прастор імёнаў XML, гл прастора імёнаў Міф № 4.
Колькасць
Прасторы імёнаў XML прымяняецца толькi да тыпу імёны элементаў і атрыбутаў. Акрамя таго, у дакуменце XML, што адпавядае рэкамендацыі прасторы імёнаў XML, асобы назвы, абазначэння імёнаў і апрацоўкі мэтаў інструкцыі не павінна ўтрымліваць двукроп'ем.
Любы чалавек можа стварыць прастору імёнаў XML - усё, што вам трэба зрабіць, гэта прызначыць спасылкі URI, як яго імя і вырашыць, які тып элемента і імёны атрыбутаў ў ёй. URI гэта называецца павінны быць пад вашым кантролем і не павінны быць выкарыстаны для ідэнтыфікацыі розных імёнаў XML, напрыклад, шляхам калегі.
(На практыцы, большасць людзей, якія ствараюць прасторы імёнаў XML таксама апісаць тыпы элементаў і атрыбутаў, чые імёны ў ёй - іх змест мадэляў і тыпаў, іх семантыка, і г.д. Аднак, гэта не з'яўляецца часткай працэсу стварэння XML. імёнаў, а таксама не ўключаюць імёнаў XML ці даць спосаб адкрыць для сябе такую ??інфармацыю.)
Можа быць, можа і няма.
Калі ў вас няма ніякіх канфліктаў імёнаў у XML-дакументы вы карыстаецеся сёння, як гэта часта бывае з дакументамі, якія выкарыстоўваюцца ўнутры адной арганізацыі, то вы, верагодна, не трэба выкарыстоўваць прасторы імёнаў XML. Аднак, калі ў вас ёсць канфлікты сёння, або калі вы чакаеце канфліктаў у будучыні з-за распаўсюджванні дакументаў за межамі арганізацыі або прыцягненне знешніх дакументаў у вашай арганізацыі, то вы павінны, верагодна, выкарыстоўваць прасторы імёнаў XML.
Незалежна ад таго, выкарыстоўваеце Ці вы прастор імёнаў XML у свае дакументы, цалкам верагодна, што вы будзеце выкарыстоўваць іх у спалучэнні з некаторымі іншымі тэхналогіі XML, такія як XSL, XHTML ці XML-схем. Напрыклад, наступныя XSLT (XSL Transformations) стыляў выкарыстоўваюцца прасторы імёнаў XML адрозніваць элемент тыпаў, вызначаных у XSLT і тых, якія вызначаны ў іншым месцы:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Address">
<!-- The Addresses element type is not part of the XSLT namespace. -->
<Addresses>
<xsl:apply-templates/>
</Addresses>
</xsl:template>
</xsl:stylesheet>
Хоць XML 1,0 рэкамендацыі Чакаецца неабходнасці прасторы імёнаў XML, адзначыўшы, што тып элемента і імёны атрыбутаў не павінны ўтрымліваць двукроп'я, гэта на самай справе не падтрымка прастор імёнаў XML. Такім чынам, XML Прасторы імёнаў слаістай-над XML 1.0. У прыватнасці, любы дакумент XML, якія выкарыстоўваюцца прасторы імёнаў XML з'яўляецца юрыдычным дакументам XML 1.0 і можа быць інтэрпрэтаванае ў якасці такіх ў адсутнасць прасторы імёнаў XML. Напрыклад, разгледзім наступны дакумент:
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B foo:C="bar"/>
</foo:A>
Калі гэты дакумент апрацоўваецца імёнаў-працэсар не ведаюць, што працэсар будзе ўбачыць двух элементаў, імёны якіх Foo: і Foo: Б. Foo: элемент мае атрыбут з імем XMLNS: Foo і Foo: B элемент мае атрыбут з імем Foo: C. З іншага боку, імёнаў-Aware працэсар ўбачыць два элемента з пашыранымі імёны {http://www.foo.org} і {} http://www.foo.org B. {} Http:// www.foo.org не мае ніякіх атрыбутаў, замест гэтага, ён мае аб'яву прасторы імёнаў, што карты Foo прэфікс http://www.foo.org спасылкай URI. {} У http://www.foo.org элемент мае атрыбут з імем {} http://www.foo.org C.
Залішне казаць, што гэта прывяло да пэўнай блытаніны. Адной з абласцей блытаніна адносін паміж прасторамі імёнаў XML і праверка XML дакументаў з DTD. Гэта адбываецца таму рэкамендацыя прастор імёнаў XML не апісаць, як выкарыстоўваць прасторы імёнаў XML з DTD. (Для атрымання дадатковай інфармацыі см. раздзел 7). Да шчасця, падобная сітуацыя не адбываецца з XML-схемы мовах, а ўсе гэтыя прасторы імёнаў XML падтрымкі.
Іншыя асноўныя вобласці блытаніна ў рэкамендацыі і характарыстыкі, такія як DOM і SAX, першая версія папярэднічае рэкамендацыя прастор імёнаў XML. Хоць іх былі абноўленыя для ўключэння XML-падтрымка прастор імёнаў, рашэнні не заўсёды былі даволі-за зваротнай сумяшчальнасці патрабаванняў. Усе рэкамендацыі ў сям'і XML зараз падтрымліваюць прасторы імёнаў XML.
Ёсць толькі два subtantial адрозненні паміж прасторамі імёнаў XML 1.0 і XML Прасторы імёнаў 1.1:
Версія 1.1 дадае спосаб undeclare прэфіксаў. Для атрымання дадатковай інфармацыі см. пытанне 4,7.
Версія 1.1 выкарыстоўвае IRI (интернационализированных ідэнтыфікатараў рэсурсаў) спасылкі замест спасылак URI. У асноўным, URI, абмежаваныя падмноства сімвалаў ASCII, а IRI, дазволіць значна больш шырокае выкарыстанне сімвалаў Unicode. Для атрымання больш падрабязнай інфармацыі гл интернационализированных ідэнтыфікатары рэсурсаў.
УВАГА: На момант напісання артыкула (студзень 2007 г.), прасторы імёнаў у XML 1.1, не па ўсёй бачнасці, шырока ўжываюцца. Перад выкарыстаннем яго, праверыць праграмнае забеспячэнне вы карыстаецеся, каб убачыць, калі яно падтрымліваецца. І калі вы абмену дакументамі з іншымі, пераканацца, што іх праграмнае забеспячэнне падтрымлівае яго.
Для аб'явы прасторы імёнаў XML, вы выкарыстоўваеце атрыбут, чыё імя мае выгляд:
xmlns:<i>prefix</i>
--OR--
xmlns
Гэтыя атрыбуты часта называюць XMLNS атрыбуты і іх значэння імя прасторы імёнаў XML быў абвешчаны, гэта спасылка URI. Першая форма атрыбуту (XMLNS: прэфікс) аб'яўляе прэфікс, які будзе звязаны з прасторай імёнаў XML. Другая форма (XMLNS) заяўляе, што пазначаны прастора імёнаў па змаўчанні прастора імёнаў XML.
Напрыклад, наступныя аб'яўляе два прасторы імёнаў XML, названы http://www.tu-darmstadt.de/ito/addresses і http://www.tu-darmstadt.de/ito/servers. Асацыюецца, перш за ўсё дэкларацыі адрас прэфікс з прасторай імёнаў http://www.tu-darmstadt.de/ito/addresses і другі Дэкларацыі абвяшчае, што http://www.tu-darmstadt.de/ito/servers імёнаў па змаўчанні прастора імёнаў XML.
<Department
xmlns:addr="http://www.tu-darmstadt.de/ito/addresses"
xmlns="http://www.tu-darmstadt.de/ito/servers">
УВАГА: Тэхнічна, XMLNS атрыбуты не атрыбуты на ўсіх - яны XML аб'явы прасторы імёнаў, што на пустым месцы, каб быць падобнымі атрыбутамі. На жаль, яны не разглядаюцца паслядоўна розныя рэкамендацыі XML, што азначае, што вы павінны быць асцярожныя пры напісанні прыкладанняў XML.
Напрыклад, у XML Information Set (http://www.w3.org/TR/xml-infoset), XMLNS "атрыбуты" не з'яўляюцца ў якасці інфармацыйных элементаў атрыбуту. Замест гэтага, яны з'яўляюцца ў выглядзе імёнаў элементаў інфармацыі дэкларацыі. З іншага боку, DOM Level 2, DOM Level 3, і SAX 2,0 лячэння атрыбутах, некалькі неадназначна. У SAX 2.0, дадатак можа даручыць аналізатар вярнуцца XMLNS "атрыбуты" разам з іншымі атрыбутамі, або апусціць іх з спісу атрыбутаў. Аналагічным чынам, хоць DOM Level 2 набору імёнаў інфармацыю, заснаваную на XMLNS "атрыбуты", гэта таксама прымушае прыкладанняў ўручную дадаць аб'явы прастор імёнаў з выкарыстаннем тых жа механізм дадатак будзе выкарыстоўваць для ўстаноўкі любых іншых атрыбутаў. (Гэтая задача вырашаецца ў DOM Level 3 з метадам Document.normalizeDocument, які дадае XMLNS атрыбутаў.)
Вы можаце аб'явіць прастора імёнаў XML на любы элемент у дакуменце XML. Імёнаў у вобласці для гэтага элемента і ўсіх яго нашчадкаў пакуль не будзе (гл. пытанне 4,5 і 4,6 пытанне) або неаб'яўленай (гл. пытанне 4,7 і 4,8 пытанне). Для атрымання дадатковай інфармацыі аб сферы, гл. раздзел 6.
Так.
Напрыклад, наступныя выкарыстоўвае FIXED XMLNS атрыбуту: Foo на тып элемента, каб звязаць Foo прэфікса з http://www.foo.org/ імёнаў. Вынікам гэтага з'яўляецца, што А і Б у http://www.foo.org/ імёнаў.
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A (foo:B)>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B (#PCDATA)>
]>
<!-- foo prefix declared through default attribute. -->
<foo:A>
<foo:B>abc</foo:B>
</foo:A>
ВАЖНА: Вы павінны быць вельмі асцярожныя аб размяшчэнні аб'явы прасторы імёнаў XML толькі знешнія аб'екты (знешнія DTD) або ў параметры асоб, у тым ліку аб'екты параметраў ва ўнутраным падмностве (унутраныя DTD). Прычынай гэтага з'яўляецца тое, што без праверкі парсер не абавязаны чытаць знешнія аб'екты або аб'екты параметраў. Напрыклад, выкажам здагадку, што папярэдні DTD быў змешчаны ў арганізацыі знешняга (foo.dtd), і што дакумент быў апрацаваны без праверкі сінтаксічны аналізатар, які не чытаў foo.dtd. Гэта прывядзе да памылкі, паколькі імёнаў Foo прэфікса ніколі не была аб'яўлена:
<?xml version="1.0" ?>
<!-- foo.dtd might not be read by non-validating parsers. -->
<!DOCTYPE foo:A SYSTEM "foo.dtd">
<!-- foo prefix not declared unless foo.dtd is read. -->
<foo:A>
<foo:B>abc</foo:B>
</foo:A>
Так як большасць рэальных DTD, з'яўляюцца знешнімі, вы можаце пазбегнуць гэтай праблемы шляхам размяшчэння аб'явы прасторы імёнаў у абодвух DTD і сам дакумент. Напрыклад:
DTD:
----
<!ELEMENT foo:A (foo:B)>
<!-- Declare the namespace in the DTD. -->
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B (#PCDATA)>
XML-дакумент:
-------------
<!DOCTYPE foo:A SYSTEM "foo.dtd">
<!-- Declare the namespace in the document. -->
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>abc</foo:B>
</foo:A>
Дакумента заўсёды імёнаў у сіле, незалежна ад таго, DTD для чытання, таму што абвяшчэнне прасторы імёнаў у самым дакуменце. Акрамя таго, дакумент сапраўдны на дачыненні DTD таму XMLNS: Foo атрыбут абвешчаныя ў DTD. Сітуацыя для XML-схем аналагічна. Дадатковыя звесткі аб прасторах імёнаў XML і DTD, глядзіце таксама раздзел 7. Дадатковыя звесткі аб прасторах імёнаў XML і XML-схем, глядзіце таксама раздзел 8.
Колькасць
Аб'яву па змаўчанні значэнне атрыбуту XMLNS ў DTD не абвясціць прастору імёнаў для XML DTD. (На самай справе, не дэкларацый прасторы імёнаў XML прымяняецца да DTD.) Замест гэтага, гэтыя значэнні па змаўчанні (заявы) ўступае ў сілу толькі тады, калі атрыбут асобніка на элемент. Напрыклад:
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A (foo:B)>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B (#PCDATA)>
]>
<foo:A> <========== Прастора імёнаў Заява уступае ў сілу тут.
<foo:B>abc</foo:B>
</foo:A> <========= Аб'ява прасторы імёнаў на гэтым сканчаецца.
Для атрымання дадатковай інфармацыі см. пытанне 7,2. (Майце на ўвазе, што ранняя версія MSXML (парсер выкарыстоўваецца Internet Explorer) не выкарыстоўваць фіксаваныя XMLNS аб'явы атрыбутаў, як прасторы імёнаў XML дэкларацыі, але што гэта было знята ў MSXML 4. Для атрымання дадатковай інфармацыі см. пытанне 10,6).
Каб змяніць прэфікс, які выкарыстоўваецца ў XML аб'яву прасторы імёнаў, вы проста абвясціць яшчэ адзін XML-імёнаў з тым жа прэфіксам. Напрыклад, у наступным, Foo прэфікс звязаны з http://www.foo.org/ імёнаў на А і В элементаў і http://www.bar.org/ імёнаў на C і D элементаў. Гэта значыць, імёны і B знаходзяцца ў http://www.foo.org/ імёнаў і назваў C і D у http://www.bar.org/ імёнаў.
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>
<foo:C xmlns:foo="http://www.bar.org/">
<foo:D>abcd</foo:D>
</foo:C>
</foo:B>
</foo:A>
Увогуле, гэта прыводзіць да дакументаў, якія збіваюць з панталыку чытаць і яго варта пазбягаць.
Каб змяніць бягучы прастора імёнаў XML па змаўчанні, вы проста абвясціць іншую прастору імёнаў XML па змаўчанні. Напрыклад, у наступным, па змаўчанні прастора імёнаў XML з'яўляецца http://www.foo.org/ імёнаў на А і В элементаў і http://www.bar.org/ імёнаў на C і D элементаў. Гэта значыць, імёны і B знаходзяцца ў http://www.foo.org/ імёнаў і назваў C і D у http://www.bar.org/ імёнаў.
<A xmlns="http://www.foo.org/">
<B>
<C xmlns="http://www.bar.org/">
<D>abcd</D>
</C>
</B>
</A>
Выкарыстаньне некалькіх прастор імёнаў XML па змаўчанні можа прывесці да дакументаў, якія збіваюць з панталыку чытаць і павінна быць зроблена акуратна. Для атрымання дадатковай інфармацыі см. пытанне 05/04.
У версіі 1.0 рэкамендацыя прастор імёнаў XML, вы не можаце "undeclare" прэфікс прасторы імёнаў XML. Яна застаецца ў вобласці да канца элемент, на якім было абвешчана, пакуль не будзе знойдзеная. Акрамя таго, спрабуючы undeclare прэфікса переобъявления яго пустым (нулявой даўжыні) URI спасылкай вынікі ў прасторы імёнаў памылкі. Напрыклад:
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>
<foo:C xmlns:foo=""> <==== This is an error in v1.0, legal in v1.1.
<foo:D>abcd</foo:D>
</foo:C>
</foo:B>
</foo:A>
У версіі 1.1 рэкамендацыя прастор імёнаў XML, вы можаце undeclare XML-прэфікс прасторы імёнаў па переобъявления яго з пустым імем. Напрыклад, у вышэйзгаданым дакуменце, XML XMLNS аб'яву прасторы назваў: Foo = "" з'яўляецца законным і выдаляе адлюстраванне з Foo прэфікс http://www.foo.org. З-за гэтага, выкарыстанне Foo прэфікс ў Foo: D вынікаў элемент у прасторы імёнаў памылкі.
Для "undeclare" па змаўчанні прастора імёнаў XML, вы аб'яўляе змаўчанні прастора імёнаў XML з пустым (нулявой даўжыні) спасылка URI. У рамках сферы ўжывання гэтай Дэкларацыі, без прэфікса імёнаў тыпу элемент не належыць ні аднаму прасторы імёнаў XML. Напрыклад, у наступным, па змаўчанні прастора імёнаў XML з'яўляецца http://www.foo.org/ для А і В элементаў і няма па змаўчанні прастора імёнаў XML для C і D элементаў. Гэта значыць, імёны і B знаходзяцца ў http://www.foo.org/ імёнаў і назваў C і D не ў любым прасторы імёнаў XML.
<A xmlns="http://www.foo.org/">
<B>
<C xmlns="">
<D>abcd</D>
</C>
</B>
</A>
Я не ведаю адказу на гэтае пытанне, але верагодна, таму, што спадзяюся, што яны б спрасціць працэс перамяшчэння фрагментаў з аднаго дакумента ў іншай дакумент. Рана праект рэкамендацыі прасторы імёнаў XML прапанаваў выкарыстаць інструкцыі па апрацоўцы абвясціць прасторы імёнаў XML. Хоць гэта былі простыя для чытання і працэс, яны не былі лёгкімі, каб перайсці да іншых дакументах. Атрыбуты, з другога боку, цесна надае элементы перамяшчаюцца.
На жаль, гэтага не працаваў, а таксама была выказана надзея. Напрыклад, разгледзім наступны дакумент XML:
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>
<foo:C>bar</foo:C>
</foo:B>
</foo:A>
Проста з дапамогай тэкставага рэдактара, каб выразаць фрагмент ўзначальвае <B> элемент з аднаго дакумента і ўставіць яго ў іншы дакумент, прыводзіць да страты інфармацыі, так як імёнаў аб'яву прасторы імёнаў не з'яўляецца часткай фрагмент - гэта на бацькоўскі элемент (<A>) - і не перамяшчаецца.
Нават калі гэта робіцца праграмна, сітуацыя не абавязкова лепш. Напрыклад, выкажам здагадку, што прыкладанне выкарыстоўвае DOM Level 2 "выразаць" фрагмент з вышэйпаказанага дакумента і "ўставіць" яго ў іншы дакумент. Хоць імёнаў інфармацыя перадаецца (гэта ажыццяўляецца ў кожным вузле), прасторы імёнаў (XMLNS атрыбут) не з'яўляецца, зноў жа, таму што гэта не частка фрагмента. Такім чынам, прыкладанне павінна ўручную дадаць дэкларацыі да серыялізацыі дакумента або новы дакумент будзе несапраўдным. (Гэтая праблема часткова вырашана ў DOM Level 3 з метадам Document.normalizeDocument, які дадае адпаведныя атрыбуты XMLNS. Тым не менш, існаванне метаду для ачысткі такіх кропак праблемы, што механізм не зусім удалым.)
Цікава адзначыць, што гэта сапраўды нічым не адрозніваецца ад сітуацыі ў строга типизированных мовах праграмавання. Напрыклад, у наступным фрагменце кода, пераменная агульнага абвешчаны як цэлае лік у першым заяве і зменнай я аб'яўлены як цэлае для артыкула:
int total = 0;
for (int i = 0; i < 10; i++)
{
total = total + i;
}
Цяпер, калі мы скароцім заяву
total = total + i;
і ўставіць яго ў іншы падзел кода, гэта прывядзе да памылцы часу кампіляцыі. Гэта таму, што мы не заявілі зменных агульнага і я ў новым раздзеле кода. Для людзей, якія звыкнуліся да працы з моцна типизированных мовах, гэта не сюрпрыз, і гэта прымаецца без пытанняў.
Нягледзячы на ??гэта, нашы чаканні адносна XML розныя: Мы чакаем, каб мець магчымасць выразаць і ўстаўляць фрагменты XML, не турбуючыся аб заявах, якія ўплываюць на імёны ў гэтых фрагментаў будуць вырашаны. Гэта, верагодна, паходзіць ад двух крыніц. Па-першае, гэта было магчыма раней прасторы імёнаў XML былі ўведзеныя. Па-другое, з пункту гледжання напісання прыкладанняў, XML бліжэй да дадзеных, чым для кода, і мы не прывыклі да такіх праблемах, пры перамяшчэнні дадзеных вакол. (Бліжэйшы, што я магу думаць пра тое, якія маюць падаваць дадзеныя з аднаго тыпу ў іншы, але гэта значна прасцей, чым турбавацца пра XML-аб'явы прасторы імёнаў.)
Гэта залежыць ад тэхналогіі - некаторыя ставяцца да іх як атрыбуты, а некаторыя ставяцца да іх як аб'явы прастор імёнаў. Напрыклад, SAX1 разглядае іх як атрыбуты і SAX2 могуць разглядаць іх як атрыбуты або аб'яўлення прасторы імёнаў, у залежнасці ад таго, як аналізатар наладжаны. (Для атрымання дадатковай інфармацыі см. пытанне 11,3 і SAX2 дакументацыі.) DOM узроўняў 1, 2 і 3 ставяцца да іх як атрыбуты, але DOM узроўняў 2 і 3 таксама інтэрпрэтаваць іх як аб'явы прастор імёнаў. (Для атрымання дадатковай інфармацыі см. пытанне 11,5 і 11,6 пытанне.) XPath, XSLT, XML-схем і разглядаць іх у якасці імёнаў дэкларацый.
Прычына таго, што розныя тэхналогіі лячэння гэтых па-рознаму, што многія з гэтых тэхналогій папярэднічалі прасторы імёнаў XML. Такім чынам, новыя версіі іх трэба турбавацца і пра прасторамі імёнаў XML і назад праблем з сумяшчальнасцю.
Пераканайцеся, што вы заявілі прэфікс (гл. Пытанне 04/01) і што ён усё яшчэ знаходзіцца ў галіне бачнасці (гл. раздзел 6). Усё, што вам трэба зрабіць, гэта прэфікс лакальнае імя тыпу элемента або атрыбуту з прэфіксам і двукроп'ем. У выніку поўнае імя (гл. пытанне 12,1), які аналізуе прыкладання, каб вызначыць, што прасторы імёнаў XML мясцовае назва належыць.
Напрыклад, выкажам здагадку, што звязана з серво прэфікс прасторы імёнаў http://www.tu-darmstadt.de/ito/servers і што гэта заява ўсё яшчэ знаходзіцца ў вобласці. У наступным, серво: Адрас спасылаецца на імя Адрас у прасторы імёнаў http://www.tu-darmstadt.de/ito/servers. (Майце на ўвазе, што прэфікс выкарыстоўваецца як на пачатковы і канчатковы тэгі.)
<!-- serv refers to the http://www.tu-darmstadt.de/ito/servers namespace. --> <serv:Address>123.45.67.8</serv:Address>
Зараз выкажам здагадку, у вас ёсць звязаныя XSLT прэфікса з http://www.w3.org/1999/XSL/Transform імёнаў. У наступным, XSLT: версія ставіцца да версіі імя ў http://www.w3.org/1999/XSL/Transform назваў:
<!-- xslt refers to the http://www.w3.org/1999/XSL/Transform namespace. --> <html xslt:version="1.0">
Пераканайцеся, што вы абвясцілі па змаўчанні прастора імёнаў XML (гл. Пытанне 04/01) і што гэта заява ўсё яшчэ знаходзіцца ў вобласці бачнасці (гл. раздзел 6). Усё, што вам трэба зрабіць, гэта выкарыстоўваць лакальнае імя тыпу элемента. Нават калі гэта не прэфікс, вынік па-ранейшаму поўнае імя (гл. пытанне 12,1), які аналізуе прыкладання, каб вызначыць, што прасторы імёнаў XML ён належыць.
Напрыклад, выкажам здагадку, што вы абвясцілі http://www.tu-darmstadt.de/ito/addresses імёнаў як прасторы імёнаў XML па змаўчанні і што гэта заява ўсё яшчэ знаходзіцца ў вобласці. У наступным, адрасы спасылаецца на імя Адрас у прасторы імёнаў http://www.tu-darmstadt.de/ito/addresses.
<!-- http://www.tu-darmstadt.de/ito/addresses is the default XML namespace. --> <Address>123.45.67.8</Address>
Для інфармацыі аб тым, як выкарыстоўваць па змаўчанні прастора імёнаў XML з імёнаў атрыбутаў, глядзіце таксама пытанне 5,3.
Вы не можаце.
Па змаўчанні прастора імёнаў XML прымяняецца толькі да імёнаў тыпу элемента, так што вы можаце спаслацца на імёны атрыбутаў, якія знаходзяцца ў прасторы імёнаў XML толькі з прэфіксам. Напрыклад, выкажам здагадку, што вы абвясцілі http://www.tu-darmstadt.de/ito/addresses імёнаў як прасторы імёнаў XML па змаўчанні. У наступным, імя тыпу атрыбуту не адносіцца да прасторы імёнаў, што, хоць тып адрасы імя элемента робіць. Гэта значыць, тыпу Адрас імя элемента ў прасторы імёнаў http://www.tu-darmstadt.de/ito/addresses, але імя тыпу атрыбут не ў любым прасторы імёнаў XML.
<!-- http://www.tu-darmstadt.de/ito/addresses is the default XML namespace. --> <Address type="home">
Каб зразумець, чаму гэта так, то памятайце, што мэта прасторы імёнаў XML з'яўляецца адназначна ідэнтыфікаваць імёны элементаў і атрыбутаў. імёны без прэфікса атрыбуту можа быць адназначна вызначаны на аснове тыпу элементаў, да якіх яны належаць, таму няма неабходнасці ідэнтыфікаваць іх далейшага ўключэння іх у прасторы імёнаў XML. На самай справе, адзіная прычына, за дазвол імёнаў атрыбутаў, каб быць вызначаны так, што атрыбуты, вызначаныя на адной мове XML можа быць выкарыстаны на іншай мове XML.
Для інфармацыі аб тым, як выкарыстоўваць па змаўчанні прастора імёнаў XML з тыпам імёны элементаў, глядзіце таксама пытанне 05/02. Для атрымання дадатковай інфармацыі пра без прэфікса імёнаў атрыбутаў і прастор імёнаў XML, гл прастора імёнаў Міф № 4.
Гэта чыста пытанне выбару, хоць ваш выбар можа паўплываць на чытальнасць дакумента. Калі элементы, імёны якіх належаць да аднаго прасторы імёнаў XML згрупаваны разам, выкарыстоўваючы па змаўчанні прастора імёнаў XML можа зрабіць дакумент больш чытэльным. Напрыклад:
<!-- A, B, C, and G are in the http://www.foo.org/ namespace. -->
<A xmlns="http://www.foo.org/">
<B>abcd</B>
<C>efgh</C>
<!-- D, E, and F are in the http://www.bar.org/ namespace. -->
<D xmlns="http://www.bar.org/">
<E>1234</E>
<F>5678</F>
</D>
<!-- Remember! G is in the http://www.foo.org/ namespace. -->
<G>ijkl</G>
</A>
Калі элементы, імёны якіх у некалькі прастор імёнаў XML перамяжоўваюцца, па змаўчанні прасторы імёнаў XML, безумоўна, зрабіць дакумент больш цяжка чытаць і прэфіксы павінны быць выкарыстаны замест. Напрыклад:
<A xmlns="http://www.foo.org/">
<B xmlns="http://www.bar.org/">abcd</B>
<C xmlns="http://www.foo.org/">efgh</C>
<D xmlns="http://www.bar.org/">
<E xmlns="http://www.foo.org/">1234</E>
<F xmlns="http://www.bar.org/">5678</F>
</D>
<G xmlns="http://www.foo.org/">ijkl</G>
</A>
У некаторых выпадках, па змаўчанні прастора імёнаў можа быць апрацаваны хутчэй, чым прэфіксы прасторы імёнаў, але розніца напэўна будзе нязначным у параўнанні з агульнага часу апрацоўкі.
Аб'ём XML аб'яву прасторы імёнаў з'яўляецца тое, што частка дакумента XML да якіх гэта заява адносіцца. XML аб'яву прасторы імёнаў застаецца ў вобласці для элемента, на якім яна была абвешчаная і ўсе яго нашчадкі, пакуль не будзе знойдзеная або неаб'яўленай на адным з гэтых нашчадкаў (гл. пытанні 4,5, 4,6 і 4,8).
Напрыклад, у наступным, сферы дэкларацыі http://www.foo.org/ імёнаў элемента і яго нашчадкаў (B і C). Аб'ём дэкларацыі http://www.bar.org/ імёнаў толькі элемент C.
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>
<bar:C xmlns:bar="http://www.bar.org/" />
</foo:B>
</foo:A>
Звярніце ўвагу, што, будучы ў сферу XML аб'яву прасторы імёнаў адрозніваецца ад прасторы імёнаў XML сябе. Знаходзячыся ў сферу дэкларацыі проста азначае, што заяву можна вырашыць прэфіксаў; гэта не азначае, што дадзеная заява фактычна вырашае прыватнасці прэфікса. Напрыклад, два аб'явы прастор імёнаў у вобласьці бачнасьці элемента C (http://www.foo.org/ і http://www.bar.org/), а толькі дэкларацыя http://www.bar. ORG/фактычна вырашае бар прэфікса.
Так.
Напрыклад, у наступным, назвы B і C знаходзяцца ў http://www.bar.org/ імёнаў, не http://www.foo.org/ імёнаў. Гэта таму, што дэкларацыя, якая звязвае Foo прэфікса з http://www.bar.org/ імёнаў адбываецца на B элемента, перакрываючы дэкларацыі аб элементам, які звязвае яго з http://www.foo.org/імёнаў.
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B xmlns:foo="http://www.bar.org/">
<foo:C>abcd</foo:C>
</foo:B>
</foo:A>
Аналагічным чынам, у наступным, назвы B і C знаходзяцца ў http://www.bar.org/ імёнаў, не http://www.foo.org/ імёнаў, паколькі заяву аб'яўленні http://www.bar. ORG/па змаўчанні прастора імёнаў XML адбываецца на B элемент, перакрываючы дэкларацыі аб элемента.
<A xmlns="http://www.foo.org/">
<B xmlns="http://www.bar.org/">
<C>abcd</C>
</B>
</A>
Апошні прыклад у тым, што ў наступным, імя атрыбуту D у http://www.bar.org/ імёнаў.
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B foo:D="In http://www.bar.org/ namespace"
xmlns:foo="http://www.bar.org/">
<C>abcd</C>
</foo:B>
</foo:A>
Адным са следстваў XML аб'явы прастор імёнаў для прымянення элементаў яны адбываюцца на тым, што яны на самой справе прымяняецца перш чым яны з'явяцца. З-за гэтага, праграмнае забеспячэнне, працэсы кваліфікаваныя імёны павінны быць асабліва асцярожныя, каб сканаваць атрыбуты элементаў XML аб'явы прасторы імёнаў, перш чым вырашыць, што прасторы імёнаў XML (калі такія маюцца) тып элемента або імя атрыбуту належыць.
Не абавязкова.
Калі элемент або атрыбут ў сферу XML аб'яву прасторы імёнаў, элемента або імя атрыбуту правяраецца, каб убачыць, калі яна мае прэфікс, адпаведны прэфікс ў заяве. Лі, на самай справе ў прасторы імёнаў XML залежыць ад таго, прэфікс супадзеньняў. Напрыклад, у наступным, тыпы элементаў A, B, D, і F і імёны атрыбутаў С і Е ў сферу дэкларацыі http://www.foo.org/ імёнаў. Хоць імёны, B, і З у http://www.foo.org/ імёнаў, назваў D, E, F і не з'яўляюцца: D і E выкарыстання іншай прэфікс (бар) і F не мае прэфікс на ўсіх.
<foo:A xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org/">
<foo:B foo:C="foo" />
<bar:D bar:E="bar" />
<F>baz</F>
</foo:A>
(Гл. таксама пытанне 3,6.)
Калі XML аб'яву прасторы імёнаў выходзіць з вобласці бачнасці, ён проста больш не ўжываецца. Напрыклад, у наступным, дэкларацыі http://www.foo.org/ імёнаў не распаўсюджваецца на элемент C, таму што гэта па-за сферы яго прымянення. Гэта значыць, гэта ў канцы мінулага B элемент, на якім імёнаў http://www.foo.org/ быў абвешчаны.
<!-- B is in the http://www.foo.org/ namespace;
C is not in any XML namespace. -->
<A>
<B xmlns="http://www.foo.org/">abcd</B>
<C>efgh</C>
</A>
У дадатак да Дэклярацыі больш не ўжываюць, любыя заявы, што ён пераадолеў вярнуцца ў вобласць. Напрыклад, у наступным, дэкларацыі http://www.foo.org/ імёнаў вярнуліся ў вобласць пасля канца элемента B. Гэта таму, што ён быў перавызначаны на B элемента дэкларацыі http://www.bar.org/ імёнаў.
<!-- A and C are in the http://www.foo.org/ namespace.
B is in the http://www.bar.org/ namespace. -->
<A xmlns="http://www.foo.org/">
<B xmlns="http://www.bar.org/">abcd</B>
<C>efgh</C>
</A>
Калі аб'ява прасторы імёнаў XML знаходзіцца ў вобласці, то любы прэфікс тыпу элемента або атрыбуту выніку імёны ў прасторы імёнаў памылкі. Напрыклад, у наступным, імёны Foo: і Foo: У выніку ў прасторы імёнаў памылкі.
<?xml version="1.0" ?> <foo:A foo:B="error" />
У адсутнасць XML аб'яву прасторы імёнаў, без прэфікса тыпу імёны элементаў і атрыбутаў не належаць да якой-небудзь імёнаў XML. Напрыклад, у наступным, імёны і B не ў любым прасторы імёнаў XML. Для атрымання дадатковай інфармацыі см. пытанне 3,6.
<?xml version="1.0" ?> <A B="no error" />
Так, пакуль яны не выкарыстоўваюць аднолькавыя прэфіксы і не больш чым адзін з іх па змаўчанні прастора імёнаў XML. Напрыклад, у наступным, http://www.foo.org/ і http://www.bar.org/ прасторы імёнаў як па ахопе, для ўсіх элементаў:
<A xmlns:foo="http://www.foo.org/"
xmlns:bar="http://www.bar.org/">
<foo:B>abcd</foo:B>
<bar:C>efgh</bar:C>
</A>
Адным са следстваў гэтага з'яўляецца тое, што вы можаце паставіць усё XML аб'явы прастор імёнаў ў каранёвай элеменце, і яны будуць знаходзіцца ў галіне бачнасці для ўсіх элементаў. Гэта самы просты спосаб выкарыстання прасторы імёнаў XML.
XML аб'явы прасторы імёнаў, якія зроблены на каранёвай элемент у магчымасці для ўсіх элементаў і атрыбутаў ў дакуменце. Гэта азначае, што просты спосаб заявіць прасторы імёнаў XML з'яўляецца аб'явіць іх толькі на каранёвай элемент. Напрыклад:
<Department
xmlns:addr="http://www.tu-darmstadt.de/ito/addresses"
xmlns:serv="http://www.tu-darmstadt.de/ito/servers">
<Name>DVS1</Name>
<addr:Address>
<addr:Street>Wilhelminenstr. 7</addr:Street>
<addr:City>Darmstadt</addr:City>
<addr:State>Hessen</addr:State>
<addr:Country>Germany</addr:Country>
<addr:PostalCode>D-64285</addr:PostalCode>
</addr:Address>
<serv:Server>
<serv:Name>OurWebServer</serv:Name>
<serv:Address>123.45.67.8</serv:Address>
</serv:Server>
</Department>
Колькасць
Прасторы імёнаў XML могуць быць аб'яўлены толькі на элементы і сферы іх прымянення складаецца толькі з гэтых элементаў і іх нашчадкаў. Такім чынам, сфера ніколі не можа ўключаць у сябе DTD. Для атрымання дадатковай інфармацыі см. пытанне 7,2.
Так, і няма.
У прыватнасці, DTD можа ўтрымліваць поўныя імёны (гл. пытанне 07/03), але прасторы імёнаў XML дэкларацыі, не прымяняюцца да DTD (гл. пытанне 7,2).
Гэта мае шэраг наступстваў. Паколькі XML-аб'явы прасторы імёнаў, не прымяняюцца да отд:
Існуе ніякай магчымасці вызначыць, якія прасторы імёнаў XML прэфікс ў кропках DTD ст. А гэта значыць...
Поўныя імёны ў DTD не могуць быць супастаўленыя з пашыраны імёнамі. А гэта значыць...
Элемент тыпу і атрыбутаў у DTD выяўляюцца ў тэрмінах поўных імёнаў, а не пашырыць імёны. А гэта значыць...
Праверка не можа быць перавызначаная ў тэрмінах пашырэння імёнаў, як і варта было чакаць.
Гэтая сітуацыя выклікала шматлікія скаргі, але, як прасторы імёнаў XML ўжо рэкамендацыі, наўрад ці зменіцца. Доўгатэрміновым рашэннем гэтай праблемы з'яўляецца XML-мова схеме: усе прапанаваныя схемы XML мовы забяспечваюць механізм, з дапамогай якога мясцовае назву ў тыпу элемента або атрыбуту Дэкларацыі, могуць быць звязаныя з прасторай імёнаў XML. Гэта дае магчымасць перагледзець дзеянні ў плане пашырэння імёнаў.
Колькасць
У прыватнасці, XMLNS атрыбутаў абвешчаныя ў DTD па змаўчанні не XML аб'яву прасторы імёнаў для DTD. Для атрымання дадатковай інфармацыі см. пытанне 4,4. (Майце на ўвазе, што ранняя версія MSXML (парсер выкарыстоўваецца Internet Explorer) не выкарыстоўваць такія заявы, як прасторы імёнаў XML дэкларацыі, але што гэта было знята ў MSXML 4. Для атрымання дадатковай інфармацыі см. пытанне 10,6).
Так.
Напрыклад, наступнае з'яўляецца законным:
<!ELEMENT foo:A (foo:B)>
<!ATTLIST foo:A
foo:C CDATA #IMPLIED>
<!ELEMENT foo:B (#PCDATA)>
Аднак, так як прасторы імёнаў XML дэкларацыі, не прымяняюцца да DTD (гл. пытанне 7,2), кваліфікаваныя імёны ў DTD не могуць быць пераўтвораны ў пашыраны імёны. Як вынік, кваліфікаваныя імёны ў DTD не маюць асаблівага сэнсу. Напрыклад, Foo: проста Foo: - гэта не ў прасторы імёнаў XML для якіх прэфікс Foo адлюстроўваецца.
Прычына кваліфікаваныя імёны дазволены ў DTD так, што праверка будзе працягваць працаваць. Для атрымання дадатковай інфармацыі см. пытанне 7,6.
Так, і няма.
Адказ на гэтае пытанне "так" у тым сэнсе, што поўнае імя ў змесце мадэль можа мець іншы прэфікс, чым поўнае імя тыпу элемента аб'яўляюцца. Напрыклад, наступнае з'яўляецца законным:
<!ELEMENT foo:A (bar:B, baz:C)>
Адказ на гэтае пытанне не ў тым сэнсе, што прасторы імёнаў XML дэкларацыі, не прымяняюцца да DTD, так прэфіксаў, якія выкарыстоўваюцца ў аб'яве тыпу элемента тэхнічна бессэнсоўныя. У прыватнасці, яны не паказалі, што назва пэўнага тыпу элемента належыць да вызначанага прасторы імёнаў. Тым не менш, магчымасць змешваць прэфіксы такім чынам, мае вырашальнае значэнне, калі: а) у вас ёсць дакумент, чые імёны прыходзяць з некалькіх прастор імёнаў XML (гл. пытанне 10,5), і б) вы хочаце пабудаваць гэты дакумент такім чынам, што гэта аднолькава сапраўдныя і адпавядае прасторы імёнаў XML рэкамендацыю (гл. пытанне 7,6).
Ды і няма, па прычынах, пералічаным у пытанні 7,4.
Напрыклад, наступнае з'яўляецца законным:
<!ATTLIST foo:A
bar:B CDATA #IMPLIED>
У адказе на гэтае пытанне, важна памятаць, што:
Тэрмін дзеяння канцэпцыі вызначаны ў XML 1.0,
XML Прасторы імёнаў слаістай-над XML 1,0 (гл. прастора імёнаў Міф № 11), і
Прасторы імёнаў XML рэкамендацыі не перагледзець дзеянні, такія, як у плане пашырэння імёнаў (гл. прастора імёнаў Міф № 9).
Такім чынам, тэрмін дзеяння такой жа, для дакумента, які выкарыстоўвае прасторы імёнаў XML і той, які гэтага не робіць. У прыватнасці, у дачыненні да дзеяння:
XMLNS атрыбуты разглядаюцца як атрыбуты, а не XML-аб'явы прасторы імёнаў.
Поўныя імёны разглядаюцца як і іншыя імёны. Напрыклад, у імя Foo:, Foo не разглядаецца як прэфікс, тоўстай кішкі не разглядаецца ў якасці падзяляе прэфікс з лакальнага імя, і не разглядаецца як лакальнае імя. Назва Foo: разглядаецца проста як імя Foo: А.
З-за гэтага, XML-дакументы, якія вы маглі б чакаць, каб быць сапраўды такімі не з'яўляюцца. Напрыклад, наступны дакумент не з'яўляецца дапушчальным, паколькі імя тыпу элемента не абвешчаныя ў DTD, нягледзячы на ??тое, як Foo: і доля пашырылася імя {} http://www.foo.org/ :
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A EMPTY>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/"
xmlns CDATA #FIXED "http://www.foo.org/">
]>
<A />
Аналагічным чынам, наступнае з'яўляецца недапушчальным, так XMLNS атрыбут не абвешчаныя ў DTD:
<?xml version="1.0" ?>
<!DOCTYPE A [
<!ELEMENT A EMPTY>
]>
<A xmlns="http://www.foo.org/>
Акрамя таго, дакументы, якія вы маглі б чакаць несапраўднымі з'яўляюцца сапраўднымі. Напрыклад, наступны дакумент сапраўдны, але ўтрымоўвае два вызначэння тыпу элемента з пашыраным імем {} http://www.foo.org/:
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A (bar:A)>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT bar:A (#PCDATA)>
<!ATTLIST bar:A
xmlns:bar CDATA #FIXED "http://www.foo.org/">
]>
<foo:A>
<bar:A>abcd</bar:A>
</foo:A>
І нарэшце, рэчаіснасць не мае нічога агульнага з правільнага выкарыстання прасторы імёнаў XML. Напрыклад, наступны дакумент сапраўдны, але не адпавядае рэкамендацыі прасторы імёнаў XML, паколькі Foo прэфікс ніколі не заявіў:
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A EMPTY>
]>
<foo:A />
Такім чынам, пры пабудове дакумента XML, які выкарыстоўвае прасторы імёнаў XML, вы павінны дзейнічаць у двух з наступных, калі вы хочаце дакумент, які будзе сапраўдным:
Напрыклад:
<?xml version="1.0" ?>
<!DOCTYPE foo:A [
<!ELEMENT foo:A (foo:B)
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B EMPTY>
]>
<foo:A>
<foo:B />
</foo:A>
Хоць гэта мінімальны набор патрабаванняў па забеспячэнні дзеянні, лепшы набор кіруючых прынцыпаў наступным чынам:
Як ужо адзначалася, пунктамі 1 і 2, неабходныя для забеспячэння дзеянні.
3 ачкі, 4 і 5 гарантыяй таго, што існуе адзін-да-аднаму паміж прэфіксаў і прастор імёнаў XML. Гэта гарантуе, што гэта не магчыма пабудаваць дакументаў, якія выкарыстоўваюць некалькі прэфікса на той жа прэфікс або жа прасторы імёнаў XML для некалькіх прастор імёнаў XML, абодва з якіх збіваюць з панталыку чытаць і схільныя памылак. Яны таксама ліквідуюць парушэнні такія, як вызначэнне тыпу элемента або атрыбуту з зададзеным разгорнутае імя некалькі разоў, як гэта было раней. На жаль, гэта таксама азначае, што прэфіксы выконваюць ролю звычайна гуляе прасторы імёнаў - унікальнай ідэнтыфікацыі прасторы імёнаў XML. Таму што гэта супярэчыць духу прэфіксы, якія былі распрацаваны за іх гібкасць, трохі лепш, рашэнне паказана ў пытанні 7,7.
Пункт 5 гарантуе, што дакумент будзе заўсёды імёнаў у сіле. Гэта не заўсёды правільна, калі прастора імёнаў XML можа быць абвешчана толькі з FIXED атрыбут ў DTD, для атрымання дадатковай інфармацыі см. пытанне 4,3.
Пункт 6 спрашчае DTD, дазваляючы XMLNS атрыбуты павінны быць абвешчаныя толькі ад тыпу каранёвай элемент (ы). У адваротным выпадку, яны павінны быць аб'яўлены на ўсе тыпы элементаў, так як прасторы імёнаў XML дэкларацыі дапускаецца на любы элемент у дакуменце.
Адна з праблем, з рашэннем, прапанаваным ў пытанні 7,6, што гэта патрабуе прэфіксы ў дакуменце, каб яны супадалі ў DTD. Да шчасця, ёсць абыходны шлях для гэтай праблемы, хоць яна патрабуе, каб адзін прэфікс будзе выкарыстоўвацца для вызначанага прасторы імёнаў у дакуменце. (Гэта добрая практыка, ва ўсякім разе, так што гэта не занадта шмат абмежаванняў.) Рашэнне мяркуе, што вы карыстаецеся DTD, што з'яўляецца знешніх па адносінах да дакумента, які з'яўляецца звычайнай практыкай.
Каб выкарыстоўваць розныя прэфіксы ў знешнія DTD і XML-дакументы, вы аб'яўляе прэфікса з парай параметраў асоб у DTD. Вы можаце перавызначыць гэтыя асобы з заявамі ва ўнутраныя DTD ў дадзеным дакуменце XML. Гэта працуе, таму што ўнутраныя DTD для чытання перад знешніх DTD і першае вызначэнне прыватнасці асобай з'яўляецца той, які выкарыстоўваецца. Ніжэй апісваецца, як выкарыстоўваць адно прастору імёнаў у DTD. Вам трэба будзе зьмяніць іх некалькі выкарыстоўваць некалькі імёнаў.
Пачнем з таго, абвясцілі тры параметру асоб у DTD:
<!ENTITY % p "" > <!ENTITY % s "" > <!ENTITY % nsdecl "xmlns%s;" >
Р асобы ("P" з'яўляецца скарачэннем ад "прэфікс") выкарыстоўваецца замест фактычнага прэфікс тыпу імёны элементаў і атрыбутаў. S асобы ("S" з'яўляецца скарачэннем ад "суфікс") выкарыстоўваецца замест фактычнага прэфікс ў дэкларацыі прасторы імёнаў. Nsdecl асобы ("nsdecl" з'яўляецца скарачэннем ад "прасторы імёнаў") выкарыстоўваецца замест назвы XMLNS атрыбут ў дэкларацыі, што атрыбут.
Зараз з дапамогай р асобы для вызначэння параметра асоб для кожнага з імёнаў у вашай імёнаў. Напрыклад, выкажам здагадку, што тыпы элементаў A, B, З і D імя атрыбуту ў вашых імёнаў.
<!ENTITY % A "%p;A"> <!ENTITY % B "%p;B"> <!ENTITY % C "%p;C"> <!ENTITY % D "%p;D">
Затым абвясціць тыпы элементаў і атрыбутаў з дапамогай "імя" асоб, якія не сапраўдныя імёны. Напрыклад:
<!ELEMENT %A; ((%B;)*, %C;)>
<!ATTLIST %A;
%nsdecl; CDATA "http://www.foo.org/">
<!ELEMENT %B; EMPTY>
<!ATTLIST %B;
%D; NMTOKEN #REQUIRED
E CDATA #REQUIRED>
<!ELEMENT %C; (#PCDATA)>
Ёсць некалькі рэчаў, каб заўважыць тут.
Атрыбут D знаходзіцца ў прасторы імёнаў, таму ён аб'яўлены з "імем" юрыдычнай асобай. Атрыбут Е не ў прасторы імёнаў, так што ніякай сутнасці выкарыстоўваецца.
Nsdecl асобы выкарыстоўваецца для аб'явы XMLNS атрыбуту. (XMLNS атрыбуты павінны быць аб'яўлены на кожны тып элемента, на якім яны могуць адбыцца.) Зьвярніце ўвагу, што значэнне па змоўчванні задаецца для XMLNS атрыбуту.
Спасылка на тып элемента B ў мадэль ўтрымання знаходзіцца ў дужках. Прычынай гэтага з'яўляецца тое, што мадыфікатар - * у дадзеным выпадку - ужываецца да яго. Выкарыстаньне дужках неабходна таму, што замены значэнняў параметра суб'ектаў прабеламі; непасрэднае прымяненне мадыфікатара параметр спасылкі на сутнасць б прывесці да незаконным сінтаксіс ў мадэлі змесціва.
Напрыклад, выкажам здагадку, што значэнне асобы "Foo:", значэнне B асобы "Foo: B", і значэнне асобы С "Foo: C". Заяву:
<!ELEMENT %A; (%B;*, %C;)>
будуць напоўнены рашучасці:
<!ELEMENT foo:A (foo:B *, foo:C)>
Гэта з'яўляецца незаконным, паколькі * мадыфікатар павінен непасрэдна прытрымлівацца спасылка на Foo: B тыпу элемента. Размяшчаючы спасылку на B асобы ў дужках, дэкларацыі дазваляецца:
<!ELEMENT foo:A ((foo:B)*, foo:C)>
Гэта з'яўляецца законным, паколькі мадыфікатар * непасрэдна варта зачыняе дужка.
Цяпер давайце паглядзім, як гэта ўсё працуе. Няхай наш XML-дакумент не будзе выкарыстоўваць прэфіксы, але замест гэтага хоча прастору імёнаў па змоўчванні для http://www.foo.org/ імёнаў. У гэтым выпадку, не сутнасцяў неабходна ў дакуменце. Напрыклад, наш дакумент можа быць:
<!DOCTYPE A SYSTEM "http://www.foo.org/foo.dtd">
<A>
<B D="bar" E="baz buz" />
<B D="boo" E="biz bez" />
<C>bizbuz</C>
</A>
Гэты дакумент з'яўляецца дапушчальным, так як аб'явы для P, S, і nsdecl ў р набор DTD і S на "" і nsdecl на "XMLNS". Гэта значыць, пасля замены P, S, і nsdecl асоб параметр, DTD складаецца ў наступным. Звярніце ўвагу, што абодва дакумента DTD і выкарыстоўваць тыпы элементаў A, B, З і імёны атрыбутаў D і E.
<!ELEMENT A ((B)*, C)>
<!ATTLIST A
xmlns CDATA "http://www.foo.org/">
<!ELEMENT B EMPTY>
<!ATTLIST B
D NMTOKEN #REQUIRED
E CDATA #REQUIRED>
<!ELEMENT C (#PCDATA)>
Але што, калі дакумент хоча выкарыстаць іншы прэфікс, напрыклад, Foo? У гэтым выпадку дакумент павінен перавызначыць дэкларацый P і S асоб у яго ўнутраныя DTD. Гэта значыць, ён павінен аб'явіць гэтыя асобы так, што яны выкарыстоўваюць Foo як прэфікс (з наступным двукроп'ем) і суфікс (папярэднічае двукроп'е). Напрыклад:
<!DOCTYPE foo:A SYSTEM "http://www.foo.org/foo.dtd" [
<!ENTITY % p "foo:">
<!ENTITY % s ":foo">
]>
<foo:A>
<foo:B foo:D="bar" E="baz buz" />
<foo:B foo:D="boo" E="biz bez" />
<foo:C>bizbuz</foo:C>
</foo:A>
У гэтым выпадку ўнутраныя DTD для чытання перад знешніх DTD, так што значэння P і S асоб з дакумента выкарыстоўваюцца. Такім чынам, пасля замены P, S, і nsdecl асоб параметр, DTD складаецца ў наступным. Звярніце ўвагу, што абодва дакумента DTD і выкарыстоўваць тыпы элементаў Foo:, Foo: B, і Foo: C і Foo імёны атрыбутаў: D і Е.
<!ELEMENT foo:A ((foo:B)*, foo:C)>
<!ATTLIST foo:A
xmlns:foo CDATA "http://www.foo.org/">
<!ELEMENT foo:B EMPTY>
<!ATTLIST foo:B
foo:D NMTOKEN #REQUIRED
E CDATA #REQUIRED>
<!ELEMENT foo:C (#PCDATA)>
Калі людзі задаюць гэтае пытанне, яны звычайна мяркуюць, што тэрмін дзеяння розных дакументаў, якія выкарыстоўваюць прасторы імёнаў XML і дакументаў, якія гэтага не робяць. На самай справе, гэта не так - гэта ж для абодвух бакоў. Такім чынам, няма ніякай розніцы паміж праверкі дакумент, які выкарыстоўвае прасторы імёнаў XML і праверку, якая не. У любым выпадку, вы проста карыстаецеся правяральны парсер або іншага праграмнага забеспячэння, які выконвае праверку.
Для інфармацыі аб тым, як пабудаваць дакумент XML, што справядліва і адпавядае рэкамендацыі прасторы імёнаў XML, глядзіце таксама пытанні 7,6 і 7,7.
Магчыма.
Калі вы хочаце, каб ваш XML-дакументаў, якія будуць аднолькава сапраўдныя і адпавядае рэкамендацыі прасторы імёнаў XML, вы павінны абвясьціць любога XMLNS атрыбутаў і выкарыстоўваць тыя ж імёны ў DTD, як у целе дакумента. (Для атрымання дадатковай інфармацыі см. пытанні 7,6 і 7,7).
Калі DTD змяшчае тып элемента і імёны атрыбутаў з аднаго прасторы імёнаў XML, прасцей за ўсё зрабіць, гэта выкарыстоўваць ваш XML імёнаў як прасторы імёнаў XML па змаўчанні. Каб зрабіць гэта, абвясціць атрыбут XMLNS (без прэфікса) для кожнага магчымага тыпу каранёвай элемент. Калі вы можаце гарантаваць, што DTD заўсёды наступным чынам (гл. Пытанне 04/03), устанавіце значэнне па змаўчанні ў кожным XMLNS аб'яву атрыбуту для спасылкі URI выкарыстоўвацца ў якасці прасторы імёнаў. У адваротным выпадку, абвясціць прастора імёнаў XML па змаўчанні прастора імёнаў XML па каранёвым элементам кожнага асобніка дакумента.
Калі DTD змяшчае тып элемента і імёны атрыбутаў з некалькіх прастор імёнаў XML, вы павінны выбраць адзін прэфікс для кожнага прасторы імёнаў XML і выкарыстоўваць гэтыя паслядоўна ў кваліфікаваных назвы на DTD і цела кожнага дакумента. Акрамя таго, неабходна аб'явіць XMLNS атрыбутаў у DTD і абвясціць прасторы імёнаў XML. Як і ў адно прастору імёнаў XML выпадку, самы просты спосаб зрабіць гэта дадаць XMLNS атрыбуты для кожнага магчымага тыпу каранёвай элемент і выкарыстоўваць значэння па змаўчанні, калі гэта магчыма.
Звярніце ўвагу, што толькі неабходна, каб гэтыя змены адразу.
Адной XML-схемы дакумента заяўляе элементаў і атрыбутаў для аднаго прасторы імёнаў XML, вядомай як мэтавае прастора імёнаў. Гэта робіцца з targetNamespace атрыбут XS: элемент схемы. Напрыклад, наступная схема заяўляе элементаў A, B, C і ў http://www.foo.org/ назваў:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:schema>
Гэта не мяжа схем для аднаго прасторы імёнаў XML. Для таго, каб выкарыстаць элементы і атрыбуты з розных імёнаў XML, яны павінны быць абвешчаныя ў іншы дакумент XML-схемы, а затым імпартаваць і спасылкі ў бягучым дакуменце XML Schema. Напрыклад, наступныя схемы аб'явіць элементаў А і У ў http://www.foo.org/ імёнаў і З у http://www.bar.org/ імёнаў. Мадэль змесціва для элемента спасылкі элемент C.
A_B.xsd:
--------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:bar="http://www.bar.org/"
targetNamespace="http://www.foo.org/">
<!-- Import namespace http://www.bar.org/ -->
<xs:import namespace="http://www.bar.org/" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
<!-- Reference C from http://www.bar.org/ -->
<xs:element ref="bar:C"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
</xs:schema>
C.xsd:
------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.bar.org/">
<xs:element name="C" type="xs:string"/>
</xs:schema>
Звярніце ўвагу, што XS: спасылкі імпарт элемент схемы, у якой C абвешчаны яго прасторы імёнаў XML, а не яго месца. Гэта дазваляе схемы працэсара вырашыць для сябе, дзе для атрымання схемы дакумента. Неабавязковы атрыбут schemaLocation можа быць выкарыстаная, каб даць схему працэсара намёк пра тое, дзе знайсці схему дакумента. Аднак, схемы працэсар не абавязаны прытрымлівацца намёк. Напрыклад, наступныя XS: імпарт элемент намякае, што дакумент схемы можна знайсці ў C: \ схем каталогу:
<import namespace="http://www.bar.org/"
schemaLocation="file://localhost/C|/schemas/C.xsd" />
У XML-схемы, элементы і атрыбуты могуць быць аб'яўлены глабальна або лакальна. Глабальных элементаў і атрыбутаў гэтых элементаў і атрыбутаў, вызначаных на знешнім узроўні схемы - гэта, як дзеці XS элемент схемы. Глабальныя элементы могуць быць выкарыстаны ў якасці каранёвага элемента. Абодва глабальных элементаў і глабальныя атрыбуты можна спасылацца з заяваў з боку іншых элементаў у іх уласную схему ці іншай схеме. Лакальныя элементы і атрыбуты гэтых абвешчаны ўнутры заяву іншага элемента. Яны могуць быць выкарыстаны толькі ўнутры элементаў, у якім яны былі абвешчаныя і не могуць быць спасылкі з аб'явы іншых элементаў.
Напрыклад, у наступнай схеме, і B абвешчаныя глабальна і C аб'яўлена лакальна. Звярніце ўвагу, што Дэкларацыя B спасылаецца ўнутры мадэлі змесціва, і C абвешчаны ў мадэль ўтрымання А.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
</xs:schema>
(У адрозненне ад гэтага, усе элементы тыпаў, вызначаных у DTD носяць глабальны характар. Яны могуць быць выкарыстаны ў якасці тыпу каранёвай элемент і можна спасылацца з мадэляў зместу іншых элементаў у тым жа DTD. Усе атрыбуты, вызначаныя ў DTD з'яўляюцца лакальнымі. Яны могуць быць выкарыстаны толькі ў тып элемента, з якім яны звязаны.)
Асноўнае адрозненне паміж мясцовымі і глабальнымі элементы і атрыбуты ў тым, што схема можа мець некалькі лакальных элементаў і атрыбутаў з тым жа імем, хоць ён можа мець толькі адзін глабальны элемент або атрыбут з тым жа імем. Гэта карысна, калі вы хочаце выкарыстоўваць тое ж імя ў розных кантэкстах.
Напрыклад, выкажам здагадку, вы вызначаеце схему для заказаў, што ўключае ў сябе заказ нумары і нумары пазіцыі. З дапамогай мясцовых элементаў, можна абвясціць два элемента імя Колькасць - той, які з'яўляецца лакальных для элемента SalesOrder і той, які з'яўляецца лакальных для LineItem элемента. Гэта карысна, калі нумары замовы маюць розны фармат нумары пазіцыі. Напрыклад, нумары замовы можа быць літарна-лічбавай, адпаведнай вызначанага шаблоне, і нумары пазіцыі могуць быць цэлыя станоўчыя чысла. Гэта не было б магчыма, калі Вы заявілі, глабальны элемент нумар. Таму што вы можаце мець толькі адзін глабальны элемент з імем нумар, вы не маглі б абмежаваць яго час у літарна-лічбавай элемент SalesOrder і цэлае станоўчае лік у LineItem элемента.
Ці лакальныя элементы і атрыбуты маюць кваліфікаваныя імёны залежыць ад elementFormDefault і attributeFormDefault атрыбуты XS: элемент схемы (або формы атрыбут XS: элемент і XS: атрыбут элементаў). Па змаўчанні, значэнне гэтых атрыбутаў "некваліфікаваным", што азначае, што лакальныя элементы і атрыбуты не маюць поўных імёнаў - гэта значыць, яны не маюць прэфіксы. Напрыклад, у наступнай схеме, У і З з'яўляюцца мясцовыя элементы, якія не з'яўляюцца кваліфікаванымі і D з'яўляецца мясцовым атрыбут, які не мае права:
<!-- elementFormDefault is "unqualified"
attributeFormDefault is "unqualified" -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/"
attributeFormDefault="unqualified"
elementFormDefault="unqualified">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:attribute name="D" type="xs:string"/>
</xs:element>
</xs:schema>
Ніжэй прыводзіцца прыклад дакумента, які адпавядае гэтай схеме. Адзначым, што B, C, D і не прэфікс.
<foo:A xmlns:foo="http://www.foo.org/" D="dddd">
<B>bbbb</B>
<C>cccc</C>
</foo:A>
У наступнай схеме, У і З з'яўляюцца мясцовыя элементы, якія з'яўляюцца кваліфікаванымі і D з'яўляецца атрыбутам, які з'яўляецца кваліфікаваным:
<!-- elementFormDefault is "qualified"
attributeFormDefault is "qualified" -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:attribute name="D" type="xs:string"/>
</xs:element>
</xs:schema>
Ніжэй прыводзіцца прыклад дакумента, які адпавядае гэтай схеме. Адзначым, што B, C, D і маюць прэфікс.
<foo:A xmlns:foo="http://www.foo.org/" foo:D="dddd">
<foo:B>bbbb</foo:B>
<foo:C>cccc</foo:C>
</foo:A>
Ці варта выкарыстоўваць кваліфікаваных (прэфікс) або няпоўнае (без прэфікса) мясцовыя імёны элементаў і атрыбутаў у асноўным стылістычнага рашэння. Гэта значыць, гэта ўплывае толькі на тое, што асобнік дакумента выглядае, не так, як гэта правяраецца. Аднак, Ёсць пэўныя перавагі і недахопы кожнага падыходу. Гл., напрыклад, XML-схем: Мэта elementFormDefault? ад Генры Томпсан і прасторы імёнаў, W3C XML Schema ад Матфея Фукс. Як правіла, людзі ставяць elementFormDefault на "кваліфікаваных" і attributeFormDefault на "безумоўнай". Гэта азначае, што ўсе імёны элементаў выкарыстоўваць прэфіксы (або імёнаў па змаўчанні), і не імёны атрыбутаў выкарыстоўваць прэфіксы.
Лі імя поўнае або няпоўнае не ўплывае Ці элемент або атрыбут лакальнай або глабальнай, а таксама не закранае сутыкненняў паміж гэтымі імёнамі. Гэта значыць, вы можаце мець некалькі поўнае або няпоўнае элементаў або атрыбутаў, якія маюць тое ж назву, да тых часоў, як яны былі абвешчаныя лакальна ў розных элементаў, і вы можаце мець толькі адзін глабальны элемент або атрыбут з тым жа імем.
Колькасць
Калі вы не жадаеце, элементы і атрыбуты, вы аб'яўляе, каб быць у любым прасторы імёнаў XML, проста не пішыце targetNamespace атрыбут з XS: элемент схемы. Напрыклад, наступныя схемы XML дакумента заяўляе элементаў A, B, і З, ні адзін з якіх знаходзіцца ў прасторы імёнаў XML:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:schema>
Для інфармацыі аб тым, што гэта добрая ідэя, каб абвясціць элементы і атрыбуты, якія не ў любым прасторы імёнаў XML, глядзіце таксама пытанне 3,9.
Chameleon схемы XML Schema, які не мае мэтавае прастора імёнаў. Яна называецца Chameleon схемы, таму што, калі ён уваходзіць у іншай схеме, ён прымае на мэтавае прастора імёнаў апошняга схемы. Гэта дазваляе схем будзе пабудаваны ў модульных частак і паўторна выкарыстоўваць у іншых схемах без блытаніны з некалькіх прастор імёнаў у гэтых схемах.
У наступным прыкладзе, Chameleon.xsd уключаны ў A.xsd праз XS: ўключаць элемент. Як вынік, элемент C у http://www.foo.org/ імёнаў. Звярніце ўвагу, што Chameleon.xsd не выкарыстоўвае targetNamespace атрыбут, а C.xsd робіць.
Chameleon.xsd
-------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="C" type="xs:string"/>
</xs:schema>
A.xsd
-----
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/">
<include schemaLocation="file://localhost/C|/schemas/Chameleon.xsd" />
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
</xs:schema>
Каб убачыць, як C змены імёнаў, разгледзім наступныя два дакумента. Першы дакумент адпавядае Chameleon.xsd; у ім, элемент З не ў любым прасторы імёнаў. Другі дакумент адпавядае A.xsd; у ім элемент C у http://www.foo.org імёнаў.
Document conforming to Chameleon.xsd
------------------------------------
<C>cccc</C>
Document conforming to A.xsd
----------------------------
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B>bbbb</foo:B>
<foo:C>cccc</foo:C>
</foo:A>
Chameleon схемы толькі бярэ на сябе мэтавае прастора імёнаў іншай схеме, калі яна ўключана ў гэтую схему, а не калі яна імпартуецца ў гэтай схеме. У тым ліку эквівалентна фізічна выразання і ўстаўкі, у выніку чаго мэтавае прастора імёнаў дэкларацыі прымяненні да "выразаць і ўставіць" (уваходзіць у камплект) схемы. Імпарт дазваляе паўторнае выкарыстанне лагічных азначэнняў і дэкларацый ад імпартуемай схемы, якая па-ранейшаму фізічна падзеленыя.
Для атрымання дадатковай інфармацыі аб тым, калі і як выкарыстоўваць Chameleon схемах гл. у W3C XML Schema Design Patterns: Як пазбегнуць складанасці па Dare Obasanjo і нуль, адзін або шмат імёнаў членаў Dev спіс рассылкі-XML. Для супрацьлеглыя пункту гледжання, гл W3C XML Schema: табу і правілы паводзінаў на Kohsuke Кавагути.
Строга кажучы, не.
Гэта таму, што прасторы імёнаў XML ў рэкамендацыі толькі кажа аб выкарыстанні прасторы імёнаў XML з элементамі і атрыбутамі. Аднак, паколькі прадметы, як складаныя тыпы, групы атрыбутаў, мадэль групы і ключавыя вызначэння выкарыстоўваць поўныя імёны, прасцей за ўсё думаць аб гэтых імёнаў як у прасторы імёнаў XML. Гэта таму, што іх імёны будуць вырашаны з выкарыстаннем тых жа механізмаў, як імёны элементаў і атрыбутаў.
Колькасць
Як было паказана ў пытанне 08/01, схема можа выкарыстаць элементы або атрыбуты з некалькіх прастор імёнаў XML. І хоць дадзенай схемы XML дакумент можа толькі дэклараваць элементы і атрыбуты ў адным прасторы імёнаў XML, адносіны паміж прасторамі імёнаў XML і XML-схемы дакументаў не з'яўляецца адназначным. Гэта таму, што некалькі дакументаў можа аб'явіць ўсе элементы і атрыбуты ў адным прасторы імёнаў XML. Калі гэта будзе зроблена, адзін XML-схемы дакумент можа ўключаць у сябе іншы дакумент XML-схемы з тым жа мэтавае прастора імёнаў з XS: ўключаць элемент.
Для атрымання дадатковай інфармацыі см. прастора імёнаў Міф № 8.
Для праверкі дакумента ад XML-схемы, неабходна выкарыстоўваць аналізатар (або іншага працэсара), якія падтрымліваюць XML-схем. Працэсар правярае, што дакумент варта правілаў у схеме.
Праверка на адпаведнасць схеме называецца праверкі схемы. Карыстальнікі супраць DTD завецца проста праверка. (На практыцы, праверку схемы часта называюць праверку і людзей зразумець, ці з'яўляецца дакумент у цяперашні час правяраецца па DTD або схем XML.)
Хоць Ёсць шэраг адрозненняў паміж схемы праверкі і пацверджання, Асноўнае адрозненне паміж двума адносна прасторы імёнаў XML з'яўляецца тое, што праверкі схемы вырашае кваліфікаваныя імёны ў пашыраны імёны да параўноўваючы іх, у той час праверкі проста параўноўвае кваліфікаваныя імёны. Як вынік, дакуменце, спраўджваюцца з XML-схем можна выкарыстоўваць любы прэфікс ў поўных імёнаў, у той час як дакуменце, спраўджваюцца з DTD павінны выкарыстоўваць прэфікс, які выкарыстоўваецца ў DTD.
Напрыклад, наступны дакумент схемы дзейнічаюць у дачыненні наступных XML-схемы, але несапраўдным у дачыненні наступных DTD. Гэта таму, што прэфікс ў дакуменце вырашае мэтавае прастора імёнаў у XML-схемы, але не адпавядае прэфікс, які выкарыстоўваецца ў DTD. Для атрымання дадатковай інфармацыі аб праверцы дакументаў, якія выкарыстоўваюць прасторы імёнаў XML супраць DTD, глядзіце таксама пытанне 7,6, 7,7 пытанне, і пытанне 7,8.
XML-дакумент:
-------------
<bar:A xmlns:bar="http://www.foo.org/">
<bar:B>bbbb</bar:B>
<bar:C>cccc</bar:C>
</bar:A>
XML-схемы:
-----------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.org/">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:sequence>
<xs:element ref="B"/>
<xs:element ref="C"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:schema>
DTD:
----
<!ELEMENT foo:A (foo:B, foo:C)>
<!ELEMENT foo:B (#PCDATA)>
<!ELEMENT foo:C (#PCDATA)>
Строга кажучы, рэчаіснасці з'яўляецца XML 1,0 канцэпцыі гэта азначае, што праверыць, што дакумент XML адпавядае правілам ў DTD. У больш агульным сэнсе, праверка сродкаў, каб праверыць, што дакумент XML адпавядае правілам ў любой схеме XML, незалежна ад схемы выкарыстоўванага мовы. Паколькі DTD, не падтрымліваюць прасторы імёнаў XML і іншых асноўных моў XML Schema (XML-схем, RELAX NG, Schematron) зрабіць падтрымку прастор імёнаў XML, таму праверкі падпадзяляюцца на дзве катэгорыі: праверкі ў дачыненні да DTD і праверкі ў дачыненні да ўсіх іншых XML-схемы мовах.
Калі дакумент XML правяраецца па DTD, любы кваліфікаваны імёнаў у дакуменце не будуць вырашаны ў пашыраны імёны да праверкі. Замест гэтага, яны параўноўваюцца на знак-сімвал аснове з імёнамі ў DTD. Такім чынам, прэфіксы ў дакуменце XML павінны адпавядаць прэфіксы ў DTD і праверкі ў дачыненні да DTD, а магчыма, на самай справе не вядуць сябе, як можна было б чакаць у дачыненні прасторы імёнаў XML. Для атрымання дадатковай інфармацыі см. пытанне 7,6, 7,7 пытанне, і пытанне 7,8.
Калі дакумент XML правяраецца па XML-схем, RELAX NG, Schematron, або любы іншы XML-мова схемы, якія падтрымліваюць прасторы імёнаў XML, кваліфікаваныя імёны вырашаюцца ў пашыраны імёны, як частка працэсу праверкі. З-за гэтага, прэфіксы ў дакуменце XML не патрабуецца, каб адпавядаць прэфіксы ў схеме XML. Гэта тое, што можна чакаць. Для атрымання дадатковай інфармацыі на праверку дакументаў у дачыненні да XML-схем, глядзіце таксама пытанне 8,7.
Прастора імёнаў праверку на падставе Дыспетчарская мова (NVDL) з'яўляецца ISO/IEC стандарт для праверкі дакументаў у дачыненні да некалькіх схем. Асноўная ідэя ў тым, што дакумент разбіваецца на поддеревья, з элементамі і атрыбутамі ў кожным поддереве абмену аднаго прасторы імёнаў XML. Сцэнар NVDL то карты кожнага прасторы імёнаў XML ў схеме выкарыстоўваецца для праверкі элементаў і атрыбутаў у гэтай прасторы імёнаў.
Напрыклад, наступны дакумент XHTML змяшчае ўбудаваны Scalable Vector Graphics (SVG) дакумента:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg">
<head>
<title>XHTML with embedded SVG</title>
</head>
<body>
<p>Following this paragraph is an
SVG fragment that defines a circle.</p>
<svg:svg width="400" height="400" version="1.1">
<svg:circle cx="200" cy="200" r="100" />
</svg:svg>
</body>
</html>
Паколькі XHTML не ўключае SVG: SVG-элемент, вы не можаце паспяхова праверыць гэта дакумент са схемай XHTML. Аднак, з NVDL, вы можаце паказаць, што XHTML элементы (http://www.w3.org/1999/xhtml імёнаў) быць правераны на адпаведнасць схеме XHTML і SVG элементаў (http://www.w3.org/2000/SVG імёнаў) быць правераны SVG-схемы. Працэсар NVDL будзе праходзіць асобна (адпраўка) поддерево XHTML (апускаючы поддерево ўзначальвае SVG: SVG-элемент) і SVG-поддерева праверкі руціны. Паколькі кожнае поддерево дзейнічае сам па сабе, дакумент у цэлым справядліва.
Найбольш важнай асаблівасцю з'яўляецца тое, што NVDL схемы не павінны ўключаць канкрэтныя месцы, дзе элементы і атрыбуты з іншай схеме, могуць быць устаўлены. (Напрыклад, XS: любы элемент у XML-схем выкарыстоўваецца для гэтага.) Замест гэтага, вы проста ўставіць элементы і атрыбуты ў XML дакумента, куды вы хочаце стварыць і NVDL сцэнар каб паказаць, як кожнага поддерева будзе правярацца. Гэта пакідае арыгінальныя схемы без зменаў - што асабліва важна для стандартных схемаў - і па-ранейшаму дазваляе правяраць дакументы.
Іншыя асаблівасці ўключаюць NVDL:
Падтрымка для любога мовы схемы. Схема мовы ідэнтыфікуюцца URI, таму працэсар NVDL проста неабходна мноства схем URI, мовы і адпаведны набор модуляў для праверкі схем выкарыстання гэтых моў.
Здольнасць прымяняць некалькі схем для аднаго поддерева.
Магчымасць паказаць, што элементы і атрыбуты ў прасторы імёнаў XML быць зацверджаны схемы, звязаныя з іншага прасторы імёнаў XML. Гэта неабходна, калі схема выкарыстоўвае некалькі прастор імёнаў XML.
Падтрымка атрыбут толькі для схем.
Магчымасць пачаць праверку на пэўны элемент, як гэта вызначана падмноства XPath.
Для атрымання дадатковай інфармацыі аб NVDL гл. http://www.nvdl.org/. Для просты прыклад выкарыстання УБЛ, глядзіце таксама Простыя працоўныя дэманстрацыі NVDL - ISO/IEC 19757-4 Г. Кен Холман.
Гэтак жа, як вы ствараеце дакументы, якія не выкарыстоўваюць прасторы імёнаў XML. Калі вы ў цяперашні час з дапамогай нататніка на Windows або Linux на Emacs, вы можаце працягваць выкарыстоўваць Нататнік або Emacs. Калі вы карыстаецеся рэдактар ??XML, які не імёнаў-Aware, вы таксама можаце працягваць выкарыстоўваць, што, як кваліфікаваныя імёны з'яўляюцца юрыдычнымі імёнаў у XML-дакументы і XMLNS атрыбуты з'яўляюцца юрыдычнымі атрыбутамі. І калі вы выкарыстоўваеце XML-рэдактар, які з'яўляецца імёнаў-Aware, ён, верагодна, забяспечыць такія функцыі, як аўтаматычнае аб'яву прасторы імёнаў XML і адсочванне прэфіксаў і па змаўчанні прастора імёнаў XML для вас.
На жаль, я не ведаю ні праграмнае забеспячэнне, якое толькі правярае на адпаведнасць рэкамендацыя прастор імёнаў XML. Цалкам магчыма, што некаторых імёнаў-Aware праверкі аналізатары (напрыклад, з DataChannel (Microsoft), IBM, Oracle або Sun) праверыць адпаведнасць імёнаў XML у якасці часткі аналізу і праверкі. Такім чынам, вы маглі б запусціць свой дакумент з дапамогай такіх аналізатараў як спосаб праверкі на адпаведнасць.
Звярніце ўвагу, што напісанне прыкладанняў, каб праверыць адпаведнасць рэкамендацыі прасторы імёнаў XML не так проста, як можа здацца. Праблема ў тым, што большасць парсераў не робяць DTD інфармацыі, якая маецца ў дадатку, таму яно не можа быць магчымым, каб праверыць адпаведнасць ў DTD. Таксама зьвярніце ўвагу, што напісанне SAX 1,0 дадатак, якое правярае адпаведнасць ў целе дакумента (у адрозненне ад DTD) павінны быць лёгка зрабіць.
Так.
Такая сітуацыя даволі часта, напрыклад, калі імёнаў-дадатку пабудаваны на верхняй часткі прасторы імёнаў не ведаюць аналізатар. Яшчэ адна распаўсюджаная сітуацыя, калі вы ствараеце XML-дакумент з прасторай імёнаў XML-рэдактар ??не ведаюць, але працэс яго імёнаў-дадаткам.
Выкарыстоўваючы той жа дакумент, як імёнаў-Aware і прасторы імёнаў не ведаюць прыкладанняў магчыма таму, што прасторы імёнаў XML выкарыстання XML сінтаксіс. Гэта значыць, дакумент XML, якія выкарыстоўваюцца прасторы імёнаў XML-ранейшаму XML-дакумента і прызнаецца ў якасці такога прасторы імёнаў не ведаюць праграмнага забеспячэння.
Адзінае, што трэба быць асцярожным пры выкарыстанні таго ж дакумента з абодвух імёнаў-Aware і імёнаў-прыкладанні не ведаюць, калі не ведаюць імёнаў-прыкладанні патрабуецца дакумент, які будзе сапраўдным. У гэтым выпадку, вы павінны быць асцярожныя, каб пабудаваць ваш дакумент такім чынам, што гэта аднолькава сапраўдныя і адпавядае рэкамендацыі прасторы імёнаў XML. (Гэта можна пабудаваць дакументаў, якія адпавядаюць прасторах імёнаў XML рэкамендацыі, але не сапраўдныя, і наадварот.) Для інфармацыі аб тым, як гэта зрабіць, глядзіце таксама пытанне 7,6.
З пункту гледжання аўтара дакумента, гэта, як правіла, не адпаведны пытанне. Большасць XML-дакументы напісаныя на пэўным мове XML і апрацоўваюцца прыкладаннем, якое разумее, што мова. Калі мова выкарыстоўвае прасторы імёнаў XML, то прыкладанне будзе ўжо выкарыстоўваць гэта прастора імёнаў - няма неабходнасці ў спецыяльных прастор імёнаў XML праграмнага забеспячэння.
Для атрымання інфармацыі аб праграмным дадатку пісьменнікаў выкарыстоўваць для апрацоўкі XML-імёнаў, глядзіце таксама раздзел 11.
Перш чым адказаць на гэтае пытанне, нам неабходна высветліць агульнае зман аб прасторах імёнаў XML. Часта лічыцца, што прасторы імёнаў XML забяспечваюць нейкую магію, якая дазваляе аўтаматычна аб'яднаць XML-дакументаў, якія выкарыстоўваюць асобныя наборы тыпаў элементаў і атрыбутаў. Гэта не так. Хоць прасторы імёнаў XML забяспечваюць некаторыя сродкі, неабходныя для гэтага, вам усё роўна прыйдзецца зрабіць вялікую частку працы самастойна, як вы ўбачыце ў адказ на гэтае пытанне.
Каб аб'яднаць дакументы, якія выкарыстоўваюць асобныя наборы тыпаў элементаў і атрыбутаў, усё, што вам сапраўды трэба зрабіць, гэта вырашыць, дзе элементы і атрыбуты ідуць у выніковы дакумент. Напрыклад, не тып элемента з першага дакумента зайсці ўнутр элемента тыпу B? Гэта родны брат? Ці яны цалкам не звязаны? Хаця працэдура на самай справе аб'яднання двух дакументаў можа быць лёгка аўтаматызаваны, вырашыць, як аб'яднаць іх наўрад ці калі-небудзь быць аўтаматызаваны. Замест гэтага, строга чалавечыя праблемы, якія патрабуюць хто-то, каб зрабіць выбар.
Напрыклад, выкажам здагадку, у нас ёсць дакумент, які змяшчае адрасы:
<Address>
<Street>Wilhelminenstr. 7</Street>
<City>Darmstadt</City>
<State>Hessen</State>
<Country>Germany</Country>
<PostalCode>D-64285</PostalCode>
</Address>
і дакумент, які змяшчае інфармацыю вэб сервера:
<Server>
<Name>OurWebServer</Name>
<Address>123.45.67.8</Address>
</Server>
Зараз выкажам здагадку, што мы хацелі б дакумент аддзелаў, іх адрасы, а таксама іх вэб-сервераў, якія мы можам зрабіць з прыведзеных вышэй дакументаў, плюс крыху дадатковай інфармацыі:
<Departments>
<Department>
<Name>DVS1</Name>
<Address>
<Street>Wilhelminenstr. 7</Street>
<City>Darmstadt</City>
<State>Hessen</State>
<Country>Germany</Country>
<PostalCode>D-64285</PostalCode>
</Address>
<Server>
<Name>OurWebServer</Name>
<Address>123.45.67.8</Address>
</Server>
</Department>
...
</Departments>
На жаль, у нас ёсць праблема: Ёсць два Адрас тыпы элементаў і два тыпу Назва элемента. (Хаця тыпаў Назва элемента абедзве мадэлі змесціва PCDATA, яны маюць розныя значэнні - адзін назоў аддзела, а іншае імя сервера - такім чынам мы хацелі б, каб прызнаць іх як розныя тыпы элементаў.)
Для рашэння гэтых канфліктаў, мы можам выкарыстоўваць прасторы імёнаў XML. Мы прызначыць інфармацыяй звяртайцеся да http://www.tu-darmstadt.de/ito/addresses імёнаў, сервер інфармацыю імёнаў http://www.tu-darmstadt.de/ito/servers, і зноў дададзеныя ведамаснай інфармацыі імёнаў http://www.tu-darmstadt.de/ito/depts. Такім чынам, новы дакумент выглядае наступным чынам:
<dept:Departments
xmlns:dept="http://www.tu-darmstadt.de/ito/depts
xmlns:addr="http://www.tu-darmstadt.de/ito/addresses
xmlns:serv="http://www.tu-darmstadt.de/ito/servers>
<dept:Department>
<dept:Name>DVS1</dept:Name>
<addr:Address>
<addr:Street>Wilhelminenstr. 7</addr:Street>
<addr:City>Darmstadt</addr:City>
<addr:State>Hessen</addr:State>
<addr:Country>Germany</addr:Country>
<addr:PostalCode>D-64285</addr:PostalCode>
</addr:Address>
<serv:Server>
<serv:Name>OurWebServer</serv:Name>
<serv:Address>123.45.67.8</serv:Address>
</serv:Server>
</dept:Department>
...
</dept:Departments>
Хоць мы маглі б прысвойвацца толькі канфліктуючымі імёнамі тыпу элемента прасторы імёнаў XML, як правіла, лепш трымаць імёны адпаведных тыпаў элементаў у адзіную прастору імёнаў XML. Гэта дазваляе пазбегнуць пытанні таго, каб памятаць імёны якіх былі змешчаныя ў прастору імёнаў XML, і якія не, а таксама пазбегнуць будучых канфліктаў, якія могуць адбыцца, калі гэтыя тыпы выкарыстоўваюцца ў іншых месцах. (Гэта не абавязкова азначае, што імёны ўсіх адпаведных тыпаў элементаў і атрыбутаў павінны быць змешчаныя ў адно прастору імёнаў XML. Калі ў вас ёсць вялікі і складаны набор тыпаў элементаў і атрыбутаў, і разлічваць на паўторнае падмноства яго ў іншым месцы, гэта можа зрабіць больш сэнсу месца імёны ўсіх шматразовых падмноства ў сваім уласным прасторы імёнаў XML.)
Гэты прыклад быў досыць просты, паколькі яна не патрабуе, каб мы змянілі існуючыя мадэлі ўтрымання. Аднак выкажам здагадку, што мы хацелі, каб захоўваць інфармацыю толькі пра серверах: іх імёны, IP-адрас, і фізічнае месцазнаходжанне. У гэтым выпадку, мы маглі б дадаць тып адрасы элемент, які апісвае адрас на ўтрыманне тып элемента Server:
<serv:Servers
xmlns:addr="http://www.tu-darmstadt.de/ito/addresses
xmlns:serv="http://www.tu-darmstadt.de/ito/servers2>
<serv:Server>
<serv:Name>OurWebServer</serv:Name>
<serv:Address>123.45.67.8</serv:Address>
<addr:Address>
<addr:Street>Wilhelminenstr. 7</addr:Street>
<addr:City>Darmstadt</addr:City>
<addr:State>Hessen</addr:State>
<addr:Country>Germany</addr:Country>
<addr:PostalCode>D-64285</addr:PostalCode>
</addr:Address>
</serv:Server>
...
</serv:Servers>
Звярніце ўвагу, што мы змянілі назву прасторы імёнаў XML для сервера інфармацыю http://www.tu-darmstadt.de/ito/servers2. Гэта таму, што мы змянілі мадэль ўтрымання элемента тыпу Server. Іншымі словамі, змест мадэлі двух тыпаў Server элемент розныя, таму яны ўяўляюць сабой два розных тыпу элемента з такой жа назвай і павінны захоўвацца ў асобных прастор імёнаў XML. Калі б мы не зрабілі гэтага змены, праграмнае забеспячэнне для пошуку старога тыпу элемента Server б няправільна апрацоўваецца новы тып элемента Server і наадварот.
Як вы можаце бачыць, няма нічога чароўнага спалучэння дакументаў. Гэта проста пытанне вырашыць, як з улікам іх разам, і, хоць Ёсць верагоднасць быць прыладамі ў будучыні, якія робяць гэта так лёгка, як перацягнуць і падзенні, рашэнне менавіта аб тым, як аб'яднаць іх, верагодна, заўсёды патрабуюць чалавечых ўмяшання.
Вы таксама можаце бачыць, што прасторы імёнаў XML гуляе жыццёва важную ролю ў гэтым працэсе - яны дазволілі нам аб'яднаць дакументы без змены мясцовыя назвы любога з тыпаў элементаў. Гэта важна, бо без прасторы імёнаў XML мы бясконца павінны вынаходзіць новыя спосабы перайменавання простых тыпаў элементаў, як адрас. Аднак, гэта таксама важна разумець, што рашэнне дубляваць імёны толькі ролю прасторы імёнаў XML гуляе ў гэтым працэсе - астатняе было пакінута на людзей, якія прымаюць рашэнні.
УВАГА! Наступныя распаўсюджваецца толькі на больш ранніх версіях MSXML. Гэта не адносіцца да MSXML 4, якая ў цяперашні час суднаходства версія [ліпеня, 2002].
Ранняя версія аналізатара MSXML, які быў адпраўлены ў рамках Internet Explorer 5.0, патрабуецца, каб кожны прэфікс прасторы імёнаў XML выкарыстоўваецца ў тып элемента або атрыбуту, дэкларацыя павінна "заявіў" ў аб'яве атрыбуту для гэтага элемента тыпу. Гэта павінна было быць зроблена з фіксаванай XMLNS аб'яву атрыбуту. Напрыклад, наступныя была прынятая MSXML і як XMLNS: Foo атрыбуты павінны былі:
<!ELEMENT foo:A (#PCDATA)>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B (#PCDATA)>
<!ATTLIST foo:B
xmlns:foo CDATA #FIXED "http://www.foo.org/">
MSXML вярнуў памылку на наступны, так як другі прэфікс Foo не быў "аб'яўлены":
<!ELEMENT foo:A (#PCDATA)>
<!ATTLIST foo:A
xmlns:foo CDATA #FIXED "http://www.foo.org/">
<!ELEMENT foo:B (#PCDATA)>
Прычына гэтага абмежавання было так, што MSXML можа выкарыстоўваць пашыраны імёны тыпу адпаведнасці элементаў і атрыбутаў для элементаў і атрыбутаў падчас праверкі. Хоць гэта было б спрошчаным многія праблемы напісання дакументаў, якія аднолькава сапраўдныя і адпавядае рэкамендацыі імёнаў XML (гл. пытанне 7,6), некаторыя карыстачы скардзіліся, таму што яна не з'яўляецца часткай прасторы імёнаў XML рэкамендацыі. У адказ на гэтыя скаргі, Microsoft выдалілі гэта абмежаванне ў больш позніх версіях, якія ў цяперашні час суднаходства. Як ні дзіўна, ідэя была пазней незалежна атрыманых як спосаб вырашэння праблем дзеянні і прасторы імёнаў. Аднак, яна не была рэалізаваная любым.
Працэс падачы заявак дакументы, якія выкарыстоўваюць прасторы імёнаў XML у амаль дакладна так жа яны апрацоўваюць дакументы, якія не выкарыстоўваюць прасторы імёнаў XML. Напрыклад, калі прастора імёнаў не ведаюць дадатак дадае новы парадак продажу баз дадзеных, калі ён сутыкаецца элемент SalesOrder, эквівалентных імёнаў-дадатку робіць тое ж самае. Розніца толькі ў тым, што імёнаў-дадатку:
Можа спатрэбіцца для праверкі XMLNS атрыбуты і разбору імёнаў. Будзь то гэта залежыць ад таго, такая апрацоўка ўжо зроблена больш нізкага ўзроўню праграмнага забеспячэння, такіх, як імёнаў-Aware рэалізацыі DOM.
Выкарыстаньне пашыраны (дзве часткі) імёнаў, а не мясцовыя (адна частка) імёны. Напрыклад, прастора імёнаў-дадатку можна дадаць новы парадак продажу ў адказ на {} http://www.tu-darmstadt.de/ito/sales SalesOrder элемент замест элемента SalesOrder.
Самы просты спосаб выкарыстання прасторы імёнаў XML з SAX 1.0 з'яўляецца выкарыстанне Джона Коўэн імёнаў SAX фільтра. На жаль, гэта не па ўсёй бачнасці, даступныя больш (гл. http://www.ccil.org/ ~ Коўэн/XML). Гэта SAX фільтр, які адсочвае прастора імёнаў XML дэкларацыі, разбірае кваліфікаваныя імёны, і вяртае тып элемента і яго атрыбуты, як пашырыць імёны ў выглядзе:
<i>URI</i>^<i>local-name</i>
Напрыклад:
http://www.tu-darmstadt.de/ito/sales^SalesOrder
Імя дадатак можа базе перапрацоўкі яго на гэтыя доўгія імёны. Напрыклад, код:
public void startElement(String elementName, AttributeList attrs)
throws SAXException
{
...
if (elementName.equals("SalesOrder"))
{
// Add new database record.
}
...
}
маглі б стаць:
public void startElement(String elementName, AttributeList attrs)
throws SAXException
{
...
if (elementName.equals("http://www.tu-darmstadt.de/sales^SalesOrder"))
{
// Add new database record.
}
...
}
або:
public void startElement(String elementName, AttributeList attrs)
throws SAXException
{
...
// getURI() and getLocalName() are utility functions
// to parse expanded names.
if (getURI(elementName).equals("http://www.tu-darmstadt.de/ito/sales"))
{
if (getLocalName(elementName).equals("SalesOrder"))
{
// Add new database record.
}
}
...
}
Калі вы не жадаеце выкарыстоўваць прастору імёнаў SAX фільтра (або не могуць яе атрымаць), то вам неабходна зрабіць наступнае ў дадатак да вызначэння тыпаў элементаў і атрыбутаў іх пашырыць імёны:
У StartElement, сканіраванне атрыбуты XML аб'явы прастор імёнаў, перш чым рабіць якой-небудзь іншай апрацоўкі. Вам трэба будзе падтрымліваць табліцы бягучага прэфікса да URI спасылкай паказваемых (у тым ліку нулявой прэфікс для прасторы імёнаў XML па змаўчанні).
У StartElement і EndElement, праверце імя элемента тыпу ўключае ў сябе прэфікс. Калі гэта так, выкарыстоўвайце ваш адлюстравання на карце гэты прэфікс для спасылкі URI. У залежнасці ад таго, як праграма працуе, вы можаце таксама праверыць, калі лакальная частка поўнае імя ўключае ў сябе любыя двукроп'я, якія з'яўляюцца незаконнымі.
У StartElement, праверце імёны атрыбутаў ўключаць прэфікс. Калі так, то працэс, як і ў папярэднім пункце.
SAX 2,0 асноўным падтрымлівае XML-імёнаў з дапамогай наступных метадаў:
StartElement і EndElement ў інтэрфейсе ContentHandler імёны вяртанне імёнаў і мясцовыя назвы, а таксама кваліфікаваныя імёны.
GetValue, Турэ, і getIndex ў інтэрфейсе Атрыбуты могуць атрымаць атрыбут інфармацыю прасторы імёнаў і лакальнае імя, а таксама поўнае імя.
Напрыклад, прастора імёнаў не ведаюць SAX 1,0 код:
public void startElement(String elementName, AttributeList attrs)
throws SAXException
{
...
if (elementName.equals("SalesOrder"))
{
// Add new database record.
}
...
}
маглі б стаць:
public void startElement(String namespaceURI,
String localName,
String qualifiedName,
Attributes attrs)
throws SAXException
{
...
if (namespaceURI.equals("http://www.tu-darmstadt.de/sales") &&
localName.equals("SalesOrder"))
{
// Add new database record.
}
...
}
Хоць гэтыя метады з'яўляюцца дастаткова для большасці прыкладанняў, SAX 2.0 таксама падтрымлівае наступныя:
startPrefixMapping і endPrefixMapping ў ContentHandler вяртання інтэрфейс сферы інфармацыі аб асобных прэфіксаў. Гэта карысна, напрыклад, калі кваліфікаваныя імёны выкарыстоўваюцца ў элемент або значэння атрыбутаў (напрыклад, у XML-схем) і прыкладанне павінна разбору гэтых імёнаў і дазволу прэфіксаў прастор імёнаў сябе.
getURI, getLocalName, і getQName ў атрыбуты інтэрфейсу вяртанне прасторы імёнаў, мясцовае назва, і поўнае імя атрыбуту па індэксе.
Http:// xml.org/features/namespaces і http://xml.org/features/namespace-prefixes ўласцівасці дазваляюць прыкладанням запытваць ці парсер вяртання кваліфікаваных імёнаў і XMLNS атрыбутаў. Дадатковыя звесткі см. ў раздзеле SAX імёнаў старонкі.
NamespaceSupport клас дапамагае адсочваць прыкладання ў цяперашні час абвешчаны прэфіксы прастор імёнаў і назваў. Гэта карысна, напрыклад, калі кваліфікаваныя імёны выкарыстоўваюцца ў элемент або значэння атрыбутаў (напрыклад, у XML-схем) і прыкладанне павінна разбору гэтых імёнаў і дазволу прэфіксаў прастор імёнаў сябе.
Для атрымання больш падрабязнай інфармацыі см. апісанне імёнаў апрацоўкі ў SAX 2.0 спецыфікацыі.
Гэта залежыць ад таго, што DOM Level 1 ажыццяўленні вы выкарыстоўваеце. Калі вы выкарыстоўваеце імёнаў-Aware DOM ажыццяўлення, такія, як ад канала дадзеных (Microsoft), IBM, Oracle, або Сонца, то ўсё што вам трэба зрабіць, гэта выкарыстанне метадаў, прадстаўленых гэтымі рэалізацыямі для атрымання прасторы імёнаў і лакальныя імёны. Напрыклад, прастора імёнаў не ведаюць код для чытаньня з дакумента:
// Check the local name.
// getNodeName() is a DOM Level 1 method.
if (elementNode.getNodeName().equals("SalesOrder"))
{
// Add new database record.
}
маглі б стаць наступныя прасторы імёнаў ведаць код пры выкарыстанні DOM рэалізацыі Oracle's:
// Check the XML namespace name (URI reference).
// getNamespace() and NSElement are Oracle-specific.
String SALES_NS = "http://www.tu-darmstadt.de/ito/sales";
if ((NSElement)elementNode).getNamespace().equals(SALES_NS))
{
// Check the local name.
// getLocalName() is Oracle-specific.
if ((NSElement)elementNode.getLocalName().equals("SalesOrder"))
{
// Add new database record.
}
}
Паколькі DOM Level 1 не ўключае ў сябе XML-падтрымка прастор імёнаў, кожны DOM Level 1 рэалізацыя дае некалькі іншы інтэрфейс для доступу да XML-імёнаў інфармацыі. Большасць з гэтых рэалізацый ўключаюць некаторыя камбінацыі метадаў для атрымання поўнае імя, прастора імёнаў, лакальнае імя і прэфікс. Таму, калі вы пішаце DOM-нейтральнай прыкладання, вам неабходна вызначыць свае ўласныя прасторы імёнаў XML інтэрфейс і пісаць пераўтваральнікі для кожнай рэалізацыі DOM вы падтрымліваеце. На шчасце, гэта лёгка зрабіць.
Пры выкарыстанні прасторы імёнаў не ведаюць DOM рэалізацыі, такіх як Docuverse версія 1 або OpenXML версіі 1 (яны могуць падтрымка прастор імёнаў XML у больш позняй версіі), вам неабходна выканаць апрацоўку імёнаў сябе. Хоць гэта шмат у чым гэтак жа, як у SAX 1.0 прыкладання (гл. пытанне 11,2) - праверка на XMLNS атрыбуты на кожным вузле элементаў і пераўтварэння кваліфікаваныя імёны элементаў і вузлоў Attr да пашырэння імёны - гэта патэнцыйна больш цяжка вызначыць, што XML аб'явы прастор імёнаў у вобласці для любога дадзенага вузла. Калі ваша заяўка праходзіць дрэва DOM ў парадку ад кораня, гэта даволі лёгка, як вы можаце падтрымліваць прэфікса для адлюстравання URI-спасылку, як вы ідзяце. Аднак, калі вы атрымліваеце доступ дрэва выпадковым чынам, вы можаце пабудаваць паралельна дрэва з адлюстраваннем інфармацыі, перш чым рабіць любыя іншыя апрацоўкі або перабудаваць дрэва DOM выкарыстанне прэфіксаў, якія супастаўляюцца з вядомым спасылкі URI.
DOM Level 2 падтрымлівае прасторы імёнаў XML праз шэраг новых метадаў і атрыбутаў. Найбольш важнымі з іх з'яўляюцца прасторы імёнаў і LocalName атрыбутаў у інтэрфейсе вузла; гэта дазваляе прыкладанням для ідэнтыфікацыі вузлоў іх прасторы імёнаў і лакальнае імя, а не поўнае імя. Напрыклад, прастора імёнаў не ведаюць код для чытаньня з дакумента:
// Check the local name.
// getNodeName() is a DOM Level 1 method.
if (elementNode.getNodeName().equals("SalesOrder"))
{
// Add new database record.
}
маглі б стаць наступныя прасторы імёнаў ведаць код:
// Check the XML namespace name (URI reference).
// getNamespaceURI() is a DOM Level 2 method.
String SALES_NS = "http://www.tu-darmstadt.de/ito/sales";
if (elementNode.getNamespaceURI().equals(SALES_NS))
{
// Check the local name.
// getLocalName() is a DOM Level 2 method.
if (elementNode.getLocalName().equals("SalesOrder"))
{
// Add new database record.
}
}
Сітуацыя пры стварэнні або змене дакумента з'яўляецца больш складаным. Гэта адбываецца таму, DOM Level 2 не аўтаматычна падтрымліваць XML аб'явы прасторы імёнаў. Гэта значыць, ён не можа аўтаматычна дадаць XMLNS атрыбутаў выкарыстоўваецца для аб'яўлення прасторы імёнаў XML. Замест гэтага вы павінны зрабіць гэта самастойна. Напрыклад, выкажам здагадку, у вас ёсць дрэва DOM, які ўяўляе наступныя дакументы, і вы хочаце дадаць <bar:C> Баз </ бар: З>, як дзіця Foo: B, дзе рыса прэфікс адпавядае http://www.foo.org/бар імёнаў.
<foo:A xmlns:foo="http://www.foo.org/foo">
<foo:B>
</foo:B>
</foo:A>
Наступны код можна выкарыстоўваць для гэтага:
// Create a text node.
Text text = document.createTextNode("baz");
// Create the bar:C element and add the text node
Element elementbarC = document.createElementNS("http://www.foo.org/bar",
"bar:C");
elementbarC.appendChild(text);
// Add the bar:C element as a child of foo:B
elementfooB.appendChild(elementbarC);
На жаль, калі дрэва DOM сериализуется ў гэтай кропцы, вынік будзе наступным, якія не заяўляюць http://www.foo.org/bar імёнаў.
<foo:A xmlns:foo="http://www.foo.org/foo">
<foo:B>
<bar:C>baz</bar:C> <=== Error! bar prefix never declared
</foo:B>
</foo:A>
Каб вырашыць гэтую праблему, вы павінны відавочна дадаць XMLNS: бар атрыбут абвясціць http://www.foo.org/bar імёнаў. (У адрозненне ад SAX 2.0, DOM Level 2 лечыць аб'яваў прастор імёнаў (XMLNS атрыбуты), як звычайна атрыбутамі.)
// Create a text node.
Text text = document.createTextNode("baz");
// Create the bar:C element and add the text node
Element elementbarC = document.createElementNS("http://www.foo.org/bar",
"bar:C");
elementbarC.appendChild(text);
// Add an xmlns:bar attribute to the bar:C element. The first argument
// is the namespace associated with the xmlns prefix, the second
// argument is the attribute name, and the third argument is the value
// of the attribute (the namespace being declared).
elementbarC.setAttributeNS("http://www.w3.org/2000/xmlns/",
"xmlns:bar",
"http://www.foo.org/bar");
// Add the bar:C element as a child of foo:B
elementfooB.appendChild(elementbarC);
Дрэва DOM зараз будзе сериализуется наступным чынам:
<foo:A xmlns:foo="http://www.foo.org/foo">
<foo:B>
<bar:C xmlns:bar="http://www.foo.org/bar">baz</bar:C>
</foo:B>
</foo:A>
Аналагічная сітуацыя адбываецца пры капіяванні вузлоў з аднаго дакумента ў іншай. У прыватнасці, калі элемент або атрыбут капіявання залежыць ад імёнаў заявіў у продка элемент, імёнаў неабходна будзе паўторна абвешчаны ў новы дакумент.
Для атрымання больш падрабязнай інфармацыі гл DOM Level 2 рэкамендацыі.
DOM Level 3 падтрымлівае імёнаў гэтак жа, як DOM Level 2, акрамя таго, што ён дадае некалькі новых метадаў і падтрымлівае версіі 1.1 Прасторы імёнаў у рэкамендацыі XML. Найбольш важныя новы метад Document.normalizeDocument у якім, сярод іншага, ачышчае аб'явы прасторы імёнаў. Такім чынам, больш няма неабходнасці відавочна дадаваць аб'явы прастор імёнаў (XMLNS атрыбутаў). Замест гэтага, вы можаце патэлефанаваць Document.normalizeDocument і рэалізацыі DOM будзе рабіць гэта за вас. (Менавіта тое, што робіцца залежыць ад шэрагу параметраў канфігурацыі. Паказаць DOMConfiguration падрабязней.)
Напрыклад, DOM Level 2 кода ў пытанне 11,5 дадаць элемент у новае прастору імёнаў для існуючага дрэва DOM становіцца:
// Create a text node.
Text text = document.createTextNode("baz");
// Create the bar:C element and add the text node
Element elementbarC = document.createElementNS("http://www.foo.org/bar",
"bar:C");
elementbarC.appendChild(text);
// Add the bar:C element as a child of foo:B
elementfooB.appendChild(elementbarC);
// Call Document.normalizeDocument to add a declaration (xmlns attribute) for the
// http://www.foo.org/bar namespace.
document.normalizeDocument();
Для атрымання больш падрабязнай інфармацыі см. Дадатак: Змены ў DOM Level 3 рэкамендацыі.
Так.
Гэта звычайная сітуацыя для агульных прыкладанняў, такіх як рэдактараў, браўзэраў, і аналізатары, якія не падключаны да разумець асаблівасці мовы XML. Такія праграмы проста лячыць ўсіх тыпаў элементаў і імёны атрыбутаў, як поўныя імёны. Тыя імёны, якія не адлюстроўваюцца ў прасторы імёнаў XML - гэта, без прэфікса тыпы элементаў у адсутнасці па змаўчанні прастора імёнаў XML і без прэфікса імёнаў атрыбутаў - проста апрацоўваецца як адна частка назвы, напрыклад, з дапамогай нуль прасторы імёнаў XML імя.
Звярніце ўвагу, што такія прыкладання павінны вырашыць, як ставіцца да дакументаў, якія не адпавядаюць рэкамендацыі прасторы імёнаў XML. Напрыклад, што павінен рабіць, калі дадатак імя тыпу элемента змяшчае двукроп'е (што прадугледжвае існаванне прэфікс), але Ёсць не XML-аб'явы прасторы імёнаў у дакуменце? Прыкладання можна выбраць для лячэння гэта як памылку, ці ён можа трактаваць дакумент як адзін, які не выкарыстоўвае XML-імёнаў, ігнараваць "памылку", і працягнуць апрацоўку.
Так.
Аднак, як правіла, не прычына для гэтага. Прычына ў тым, што большасць прыкладанняў зразумець асаблівасці мовы XML, напрыклад, адзін выкарыстоўваецца для перадачы заказаў паміж кампаніямі. Калі тып элемента і імёны атрыбутаў ў мове належаць да прасторы імёнаў XML, прыкладанне павінна быць імёнаў-Aware, а калі няма, то заява павінна быць прастора імёнаў не ведаюць. Напрыклад, такія прыкладання не павінны неабходна прызнаць тыпы элементаў SalesOrder і {} http://www.tu-darmstadt.de/ito/sales SalesOrder.
На працягу некалькіх прыкладанняў, быўшы і імёнаў-Aware і прасторы імёнаў не ведаюць сэнс. Напрыклад, сінтаксічны аналізатар можа выбраць перагледзець дзеянні ў плане пашырэння імёнаў (гл. прастора імёнаў Міф № 9) і мець як імёнаў-Aware і прасторы імёнаў не ведаюць рэжыму праверкі. Аднак, такія заявы з'яўляюцца рэдкасцю.
Рэкамендацыя прастор імёнаў XML не вызначае, што імёнаў-дадатку робіць, калі ён сутыкаецца дакумент, які не адпавядае рэкамендацыі. Такім чынам, паводзіны прыкладання залежныя. Напрыклад, дадатак можа спыніць апрацоўку, пасля памылкі ў часопіс і працягнуць апрацоўку, ці ігнараваць памылку.
Імем з'яўляецца імя наступную форму. Яна складаецца з дадатковага прэфікса і тоўстай кішкі, а затым лакальную частка, якая часам вядомы як лакальнае імя.
<i>prefix</i>:<i>local-part</i>
--OR--
<i>local-part</i>
For example, both of the following are qualified names. The first name has a prefix of serv; the second name does not have a prefix. For both names, the local part (local name) is Address.
serv:Address Address
У большасці выпадкаў, кваліфікаваныя імёны супастаўляюцца з пашыраны імёнамі. Для атрымання дадатковай інфармацыі см. пытанне 12,6.
QName з'яўляецца поўнае імя. Тэрмін паходзіць ад БНФ выкарыстоўваецца ў Прасторы імёнаў у XML-рэкамендацыі, дзе QName гэта імя не-тэрмінала выкарыстоўваецца для перадачы сінтаксіс імя.
На жаль, тэрмін QName звычайна выкарыстоўваецца як скарачэнне для пашырэння імя (гл. пытанне 12,12). Гэта, верагодна, паходзіць ад тыпу QName дадзеных у XML-схем, якая пашырыла свае імёны, як прастора значэнне і кваліфікаваныя імёны, як яго лексічнага прасторы.
Прэфікс можа ўтрымліваць любыя сімвалы, якія дапускаюцца ў Назва [5] вытворчасці ў XML 1.0, акрамя тоўстай кішкі. Тое ж самае адносіцца і мясцовае назву. Такім чынам, не можа быць не больш адной тоўстай кішкі ў поўнае імя - двукроп'е выкарыстоўваецца для падзелу прэфікс з лакальнага імя.
Поўныя імёны могуць з'яўляцца ў любым месцы тып элемента або імя атрыбуту можа з'явіцца: у пачатковы і канчатковы тэгі, як тып элемента дакумента, а ў тыпе элементаў і атрыбутаў у DTD. Напрыклад:
<!DOCTYPE foo:A [
<!ELEMENT foo:A (foo:B)>
<!ATTLIST foo:A
foo:C CDATA #IMPLIED>
<!ELEMENT foo:B (#PCDATA)>
]>
<foo:A xmlns:foo="http://www.foo.org/" foo:C="bar">
<foo:B>abcd</foo:B>
</foo:A>
Поўныя імёны не можа з'явіцца як асоба назвы, абазначэння імёнаў, або апрацоўкі мэт навучання.
Так, але яны не маюць асаблівага значэння. Гэта значыць, яны не заўсёды прызнаюцца ў якасці такіх і падключаныя да пашырэння імёны. Напрыклад, значэнне атрыбуту C у наступным з'яўляецца радок "Foo: D", а не разгорнутае імя {} http://www.foo.org/ D.
<foo:A xmlns:foo="http://www.foo.org/">
<foo:B C="foo:D"/>
</foo:A>
Нягледзячы на ??гэта, няма нічога, каб спыніць прыкладанне ад прызнання поўнае імя ў значэнне атрыбуту і перапрацоўкі яго як такое. Гэта робіцца ў розных сучасных тэхналогій. Напрыклад, у наступным вызначэнні XML-схемы, значэнне атрыбуту XS: радок вызначае тып Foo атрыбут як разгорнутае імя {} http://www.w3.org/1999/XMLSchema радка.
<xs:attribute name="foo" type="xs:string" />
Ёсць два магчымых праблем з гэтым. Па-першае, заява павінна быць у стане аднавіць прэфікс паказваемых ў цяперашні час у сіле. Да шчасця, як SAX і DOM 2,0 узроўняў 2 і 3 падтрымліваюць гэтую магчымасць. Па-другое, якія-небудзь агульныя інструмент пераўтварэнні мэтаў, такіх, як той, які піша XML-дакумента ў кананічны выгляд і змяненняў прэфіксаў прасторы імёнаў у працэс, не будзе прызнаваць кваліфікаваныя імёны ў значэннях атрыбутаў і, такім чынам, не ператварыць іх правільна. Хоць гэта можа быць вырашана ў будучыні ўвядзенне QName (поўнае імя) Тып дадзеных у XML-схем, гэта праблема сёння.
Калі поўнае імя ў тэле дакумента (у адрозненне ад DTD) уключае ў сябе прэфікс, тое, што прэфікс выкарыстоўваецца для прывязкі лакальнай часткі поўнага імя, каб пашырыць імя - гэта значыць, імя прасторы імёнаў XML. (Майце на ўвазе, што прэфікс павінен быць у рамкі - гл раздзел 6.) Напрыклад, у наступным, прэфікс Foo выкарыстоўваецца для карты мясцовых назваў, B, C і імёнах у http://www.foo. ORG/імёнаў:
<?xml version="1.0" ?>
<foo:A xmlns:foo="http://www.foo.org/" foo:C="bar">
<foo:B>abcd</foo:B>
</foo:A>
Калі поўнае імя ў тэксце дакумента не ўтрымлівае прэфікса і прасторы імёнаў XML па змаўчанні знаходзіцца ў вобласці, то адна з двух рэчаў не адбываецца. Калі імя выкарыстоўваецца ў якасці элемента тэга, ён пераходзіць да імя ў меню па змаўчанні прастора імёнаў XML. Калі ён выкарыстоўваецца ў якасці атрыбуту імя, гэта не ў любым прасторы імёнаў XML (гл. прастора імёнаў Міф № 4). Напрыклад, у наступным, А і В у http://www.foo.org/ імёнаў і З не ў любым прасторы імёнаў XML:
<?xml version="1.0" ?>
<A xmlns="http://www.foo.org/" C="bar">
<B>abcd</B>
</A>
Калі поўнае імя ў тэксце дакумента не ўключае ў сябе прэфікс і не па змаўчанні прастора імёнаў XML знаходзіцца ў вобласці бачнасці, то, што імя не ў любым прасторы імёнаў XML. Напрыклад, у наступным, A, B, C і не ў любым прасторы імёнаў XML:
<?xml version="1.0" ?>
<A C="bar">
<B>abcd</B>
</A>
Поўныя імёны ў DTD ніколі не адлюстроўваецца на імёны ў прасторы імёнаў XML, таму што яны ніколі ў сферу XML аб'яву прасторы імёнаў. (Для атрымання дадатковай інфармацыі см. пытанне 7,2.)
Прэфікс імя поўнае імя (гл. пытанне 12,1), які змяшчае прэфікс.
Без прэфікса імя поўнае імя (гл. пытанне 12,1), не ўтрымліваюць прэфікс.
Толькі калі яны выкарыстоўваюцца ў тэле дакумента (у адрозненне ад DTD) у якасці тэга элемента і прасторы імёнаў XML па змаўчанні знаходзіцца ў вобласці. Для атрымання дадатковай інфармацыі см. пытанне 05/02.
Гэта яшчэ адзін тэрмін для лакальнай часткі імя. Для атрымання дадатковай інфармацыі см. пытанне 12,1.
Гэта імя выкарыстоўваецца для ідэнтыфікацыі прасторы імёнаў. Гэта спасылка URI. Для атрымання дадатковай інфармацыі см. пытанне 14,1.
Пашыраны імя з двух частак імя, якое складаецца з XML прасторы імёнаў і лакальнае імя. Напрыклад, у наступным, пашыраны імя прасторы імёнаў "http://www.tu-darmstadt.de/ito/servers" плюс мясцовае назву "Адрас":
<serv:Address xmlns:serv="http://www.tu-darmstadt.de/ito/servers">
123.45.67.8
</serv:Address>
Магчымасць ўказанні імёнаў пашырылася толькі функцыя імёнаў XML.
Пашыраны QName з'яўляецца пашыранае імя. Тэрмін паходзіць ад рэкамендацыі XQuery, якія, як мяркуецца, выкарыстоўваецца тэрмін замест пашырэння імя, таму што яна мае справу з іншымі імёнамі.
Універсальны імя разгорнутае імя. Тэрмін паходзіць ад артыкула Джэймсам Кларкам і быў выкарыстаны ў больш ранняй версіі гэтага артыкула. (Першае выданне Прасторы імёнаў у XML 1.0 рэкамендацыі не прадастаўляць тэрмін для гэтага паняцця; тэрмін разгорнутае імя было ўведзена ў другое выданне).
Існуе няма стандартнага спосабу прадстаўляць разгорнутае імя. Аднак, тры прадстаўлення з'яўляюцца агульнымі.
Першае прадстаўленне захоўвае XML прасторы імёнаў і лакальнае імя асобна. Напрыклад, многія DOM Level 1 рэалізацый маюць розныя метады для вяртання імёнаў XML імёнаў і лакальнае імя вузла элемента або атрыбуту.
Другое прадстаўленне аб'ядноўвае прасторы імёнаў і лакальнае імя з ўстаўкі (^). У выніку універсальных унікальных (гл. пытанне 12,16) імя, так як carets не дапускаюцца ў спасылкі URI ці мясцовыя назвы. Гэта метад, які выкарыстоўваецца імёнаў SAX Джона Коўэн фільтр, які быў напісаны для апрацоўкі XML-імёнаў у SAX 1.0. Напрыклад, пашыраны імя, якое спасылкай URI http://www.tu-darmstadt.de/ito/servers і лакальны адрас імя будзе прадстаўлена як:
http://www.tu-darmstadt.de/ito/servers^Address
Трэцяе прадстаўленне, якое мы выкарыстоўваем у гэтым дакуменце, была выкарыстаная ў артыкуле Джэймсам Кларкам. Гэта месца прасторы імёнаў XML у фігурныя дужкі і аб'ядноўвае гэта з мясцовым назвай. Гэта абазначэнне прапануецца толькі на дакументацыю, і я аддаю сабе справаздачу не код, які выкарыстоўвае яго. Напрыклад, вышэй імя будзе прадстаўлена як:
{} Http:// www.tu-darmstadt.de/ito/servers Адрас
Не, але ёсць падставы меркаваць, што яны з'яўляюцца.
Пашыраны тып элемента і імёны атрыбутаў не гарантуецца універсальных унікальных - гэта значыць, унікальны ў прасторы ўсіх дакументаў XML - таму што гэта магчыма для двух розных людзей, кожны вызначае свае ўласныя прасторы імёнаў XML, каб выкарыстоўваць тую ж спасылку URI і той жа тып элемента або імя атрыбуту. Аднак гэта адбываецца толькі тады, калі:
Адзін або абодва людзі выкарыстоўваюць спасылкай URI, які не знаходзіцца пад іх кантролем, такіх, як хто-то за межамі Netscape выкарыстаннем http://www.netscape.com/ URI спасылкі, або
І людзі маюць кантроль над спасылкай URI і як яго выкарыстоўваць.
У першым выпадку сродкі хто-то падман пры назначэнні URI (працэс рэгулюецца даверу) і другім выпадку азначае, што два чалавека ў арганізацыі, не звяртаючы ўвагі на працу адзін аднаго. Для шырока апублікаваныя тыпу імёны элементаў і атрыбутаў, ні ў адным выпадку вельмі верагодна. Такім чынам, разумна выказаць здагадку, што пашырэнне імёны універсальных унікальных. (Так як абодва выпадку, прыкладанняў, якія ўяўляюць пагрозу бяспецы варта быць асцярожным пры здагадцы, што пашырэнне імёны універсальных унікальных.)
Для атрымання інфармацыі аб магчымасці пашырэння імёнаў для ідэнтыфікацыі тыпаў элементаў і атрыбутаў (у адрозненне ад імёнаў самі не унікальным), гл прастора імёнаў Міф № 2.
XML-прэфікс прасторы імёнаў прэфікс, які выкарыстоўваецца для ўказанні, што лакальны тып элемента або імя атрыбуту ў пэўным прасторы імёнаў XML. Напрыклад, у наступным, серво прэфікс паказвае, што тып адрасы імя элемента ў прасторы імёнаў http://www.tu-darmstadt.de/ito/addresses:
<serv:Addresses xmlns:serv="http://www.tu-darmstadt.de/ito/addresses">
Прэфікс можа ўтрымліваць любыя сімвалы, якія дапускаюцца ў Назва [5] вытворчасці ў XML 1.0, акрамя тоўстай кішкі.
Варта адзначыць, што XML прэфікс можа быць звязаны з http://www.w3.org/XML/1998/namespace прасторы імёнаў. XMLNS прэфікс не можа быць выкарыстана толькі аб'явіць прастора імёнаў, напрыклад, XMLNS: XMLNS = "http://www.w3.org/2000/xmlns/" не з'яўляецца юрыдычным імёнаў.
Колькасць
Напрыклад, наступныя ўмовы эквівалентныя:
<serv:Addresses xmlns:serv="http://www.tu-darmstadt.de/ito/addresses">
і
<foo:Addresses xmlns:foo="http://www.tu-darmstadt.de/ito/addresses">
Аднак, прэфіксы забяспечваюць візуальны сігнал для чытачоў. З-за гэтага, праграмнае забеспячэнне (асабліва рэдактары) варта разгледзець пытанне аб захаванні прэфіксаў. Напрыклад, гэта значна лягчэй чытаць:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="/">
<html:html>
<html:head><html:title>Title</html:title></html:head>
<html:body>
<xsl:apply-templates/>
</html:body>
</xsl:template>
...
</xsl:stylesheet>
чым гэта:
<aaa:stylesheet version="1.0"
xmlns:aaa="http://www.w3.org/1999/XSL/Transform"
xmlns:bbb="http://www.w3.org/TR/xhtml1/strict">
<aaa:template match="/">
<bbb:html>
<bbb:head><bbb:title>Title</bbb:title></bbb:head>
<bbb:body>
<aaa:apply-templates/>
</bbb:body>
</aaa:template>
...
</aaa:stylesheet>
або (значна горш, пакуль) гэта:
<html:stylesheet version="1.0"
xmlns:html="http://www.w3.org/1999/XSL/Transform"
xmlns:xsl="http://www.w3.org/TR/xhtml1/strict">
<html:template match="/">
<xsl:html>
<xsl:head><xsl:title>Title</xsl:title></xsl:head>
<xsl:body>
<html:apply-templates/>
</xsl:body>
</html:template>
...
</html:stylesheet>
Нягледзячы на ??гэта, людзі, верагодна, чытаць значнасць у прэфіксы, так што гэта добрая ідэя выкарыстаць прэфіксы, якія адпавядаюць іх імёнаў XML, такія як XSLT для прасторы імёнаў XSLT.
Нарэшце, хоць прэфіксы не з'яўляюцца значнымі ў імёны элементаў і атрыбутаў, яны могуць быць значнымі пры выкарыстанні іншых дакументаў XML, напрыклад, у DTD (гл. пытанне 7,6) або значэнне атрыбуту. Таму што такое выкарыстанне з'яўляецца агульным - напрыклад, XML-схемы выкарыстоўваюцца поўныя імёны ў значэннях атрыбутаў - гэта напіхвае на думку, што яна вызначаецца рэкамендацыя прастор імёнаў XML. Гэта не так: рэкамендацыя прастор імёнаў XML вызначае толькі выкарыстанне прэфіксаў імёнаў элементаў і атрыбутаў. Выкарыстаньне прэфіксаў ў іншым месцы дакумента XML вызначана па-за рэкамендацыя прастор імёнаў XML і цалкам адказнасць вызначэнні дадатку. Для атрымання дадатковай інфармацыі см. пытанне 12,5.
Так.
Напрыклад, у наступным, B ў http://www.foo.org/ імёнаў і З у http://www.bar.org/ назваў:
<A>
<foo:B xmlns:foo="http://www.foo.org/">abc</foo:B>
<foo:C xmlns:foo="http://www.bar.org/">abc</foo:C>
</A>
Памятаеце, аднак, што прэфікс прасторы імёнаў XML дэкларацыі перавызначаць жа прэфікс, калі што прэфікс заявіў на продка. Напрыклад, у наступным, С у http://www.bar.org/ імёнаў, не http://www.foo.org/ назваў:
<A>
<foo:B xmlns:foo="http://www.foo.org/">
<foo:C xmlns:foo="http://www.bar.org/">abc</foo:C>
</foo:B>
</A>
Увогуле, гэта добрая ідэя выкарыстаць прэфікс для толькі адно прастору імёнаў XML, так як гэта памяншае блытаніну пры чытанні дакумента. Нягледзячы на ??гэта, існуе рэальная магчымасць таго, што ж прэфікс будзе выкарыстоўвацца для некалькіх прастор імёнаў XML пры аб'яднанні фрагментаў з розных дакументаў. Для атрымання дадатковай інфармацыі см. пытанне 4,9.
Так.
Напрыклад, у наступным, як У і З у http://www.foo.org/ назваў:
<A xmlns:foo="http://www.foo.org/"
xmlns:bar="http://www.foo.org/">
<foo:B>abc</foo:B>
<bar:C>abc</bar:C>
</A>
Больш разумна, гэтая сітуацыя можа паўстаць пры капіяванні ці выразаць і ўстаўляць фрагменты з аднаго дакумента ў іншай, дзе кожны дакумент выкарыстоўвае іншы прэфікс для тых жа імёнаў. Напрыклад, выкажам здагадку, http://www.foo.org/ імёнаў выкарыстоўвае Foo прэфікс ў адным дакуменце і бар прэфіксам ў іншым дакуменце. Капіраванне элементаў з аднаго дакумента ў іншай можа прывесці да дакумента, такія як наступныя. Хоць гэта і дзіўна чытаць, гэта цалкам законна.
<A xmlns:foo="http://www.foo.org/">
<foo:B>abc</foo:B>
<bar:C xmlns:bar="http://www.foo.org/">abc</bar:C>
</A>
Увогуле, гэта добрая ідэя, каб выкарыстоўваць толькі адзін прэфікс для прасторы імёнаў XML, так як гэта памяншае блытаніну пры чытанні дакумента.
Прэфіксы абвешчаныя ў дэкларацыі прасторы імёнаў XML (XMLNS атрыбут). Для атрымання дадатковай інфармацыі см. пытанне 4,1.
Так, і няма. Гэта падтрымліваецца ў версіі 1,1, але не ў версіі 1,0. На момант напісання артыкула [Студзень, 2007], вялікая частка праграмнага забеспячэння для падтрымкі з'яўляецца версія 1.0, таму не варта разлічваць на гэтую здольнасць. Для інфармацыі аб тым, як undeclare прэфікс, глядзіце таксама пытанне 4,7.
Адзначым, што ў абедзвюх версіях 1.0 і 1.1, можна перавызначыць прэфікс (гл. Пытанне 04/05) або хай аб'яву прасторы імёнаў XML, які аб'яўляе прэфікс выходзяць з сферы (гл. пытанне 6,4). Вы таксама можаце undeclare змаўчанні прастора імёнаў XML (гл. пытанне 4,8).
Гэта прыводзіць да памылцы імёнаў. Напрыклад, наступны дакумент не адпавядае рэкамендацыі прасторы імёнаў XML.
<?xml version="1.0" ?> <foo:A />
Аднак, рэкамендацыя прастор імёнаў XML не вызначае, што імёнаў-дадатку робіць, калі ён сутыкаецца, не-сумяшчальную дакумента, таму паводзіны прыкладання залежныя. Напрыклад, дадатак можа спыніць апрацоўку, пасля памылкі ў часопіс і працягнуць апрацоўку, ці ігнараваць памылку.
Калі па змаўчанні XML аб'яву прасторы імёнаў у вобласці бачнасці, то імя тыпу элемента ў прасторы імёнаў XML па змаўчанні. У адваротным выпадку імя тыпу элемента ня ў любым прасторы імёнаў XML. Напрыклад, у наступным, У і З у http://www.foo.org/ імёнаў і не ў любым прасторы імёнаў XML:
<A>
<B xmlns="http://www.foo.org/">
<C>abc</C>
</B>
</A>
Імя атрыбуту не ў любым прасторы імёнаў XML. Гэта значыць, прастора імёнаў XML па змаўчанні не прымяняецца да прэфікса імёнаў атрыбутаў.
Для атрымання дадатковай інфармацыі см. прастора імёнаў Міф № 4.
XML прасторы імёнаў спасылкі URI, які адназначна вызначае прастору імёнаў. URI спасылкі выкарыстоўваюцца, таму што яны шырока разумеецца і добра дакументаваны. (Звярніце ўвагу, што URI спасылкі адрозніваюцца ад URI, у тым, што яны дазваляюць ідэнтыфікатары фрагмента (#).) Таму што людзі могуць толькі вылучыць URI, якія знаходзяцца пад іх кантролем, лёгка забяспечыць, каб ніякія два прасторы імёнаў XML вызначаюцца жа спасылка URI.
Заўвага: Версія 1.1 рэкамендацыя прастор імёнаў XML выкарыстоўвае IRI (интернационализированных ідэнтыфікатараў рэсурсаў) спасылкі замест спасылак URI.
Прасторы імёнаў XML URI з'яўляецца XML прасторы імёнаў. Хоць тэрмін афіцыйна не вызначаны ў прасторах імёнаў у рэкамендацыі XML, ён часта выкарыстоўваецца.
XML прасторы імёнаў могуць утрымліваць любыя сімвалы дазволены ў спасылку URI. URI спасылкі параўноўваюцца на знак-сімвал аснове, так капіталізацыі і выкарыстанне знака працэнта (%) з'яўляюцца значнымі. Напрыклад, пасля ўсіх выяўлення і той жа рэсурс у адпаведнасці са спецыфікацыяй URI, але розныя прасторы імёнаў:
http://www.example.org/wine http://www.example.org/wine# http://www.Example.org/wine http://www.example.org/win%65
У версіі 1.1, адказу няма.
У версіі 1,0, так. Аднак, такое выкарыстанне не рэкамендуецца, так што вы ніколі не павінны рабіць гэта.
Арыгінальны прасторы імёнаў XML рэкамендацыя не відавочна забараніць выкарыстанне адносных спасылак URI ў якасці імёнаў назвы. Замест гэтага, ён сцвярджае, што два прасторы імёнаў з'яўляюцца ідэнтычнымі, калі іх URI спасылкі матч знакаў характар. Затым ён адзначае, што неидентичных URI спасылкі могуць быць функцыянальна эквівалентныя, напрыклад, калі яны адрозніваюцца толькі ў тым выпадку. У спалучэнні з спецыфікацыі URI (RFC2396), у якім гаворыцца, што адносныя спасылкі URI ўзяць на базе URI ад таго дакумента, гэта пры ўмове шчыліна, з якой выкарыстанне адносных спасылак URI.
Калі гэта было выяўлена больш чым праз год пасля рэкамендацыя была выпушчаная яна апынулася надзвычай спрэчным. Напрыклад, некаторыя людзі хацелі выкарыстаць адносныя спасылкі URI ў якасці імёнаў назвы так, што элементы і атрыбуты будуць мець розныя прасторы імёнаў XML назваў, у залежнасці ад таго, што дакумент яны цалі пярэчанняў супраць гэтага было тое, што гэта падарве мэта прасторы імёнаў XML. Гэта значыць, прасторы імёнаў XML больш не будзе даваць універсальных унікальных імёнаў.
Пасля больш чым двух месяцаў абмеркавання, было вырашана, што адносныя спасылкі URI не пашыраны пры выкарыстанні ў якасці імёнаў назвы і што іх выкарыстанне было састарэлым. Гэта значыць, выкажам здагадку, што наступны дакумент мае URI з "http://www.foo.org/xml/relativeExample.xml".
<A xmlns:foo="../relativeURI">
<foo:B>abc</foo:B>
<bar:C>abc</bar:C>
</A>
Хоць спасылка URI "../relativeURI" не распаўсюджваецца на спасылкі URI "http://www.foo.org/relativeURI", імя прасторы імёнаў XML, звязаных з Foo прэфікс "../relativeURI", не пашыраны спасылкай URI.
Было таксама вырашана, што:
Infoset рэкамендацыі не вызначаюць Infoset для дакументаў, якія выкарыстоўваюцца адносныя спасылкі URI як XML прасторы імёнаў.
Значэнне атрыбута прасторы імёнаў інтэрфейс вузла ў DOM не вызначаны, калі спасылка URI з'яўляецца адноснай.
Вяртаецца значэння імёнаў-URI () у XPath не вызначаны, калі спасылка URI з'яўляецца адноснай.
Усе новыя рэкамендацыі W3C павінна ўключаць заяву аб тым, што яны не прымяняюцца да XML-дакументаў, якія выкарыстоўваюцца адносныя спасылкі URI як XML прасторы імёнаў.
Для архівах спісу рассылання абмяркоўваюць выкарыстанне адносных спасылак URI ў якасці імёнаў назвы, глядзіце http://lists.w3.org/Archives/Public/xml-uri/. Для вынікі W3C XML пленарнага галасавання па выкарыстанні адносныя спасылкі URI ў XML прасторы імёнаў, гл http://www.w3.org/2000/09/xppa.
Спасылка URI выкарыстоўвацца ў якасці прасторы імёнаў XML проста ідэнтыфікатар. Гэта не абавязкова паказвае на што-небудзь і, увогуле, гэта дрэнная ідэя, каб лічыць, што ён робіць. Гэты момант выклікае шмат блытаніны, таму мы будзем паўтараць яго тут:
URI REFERNECESs выкарыстоўваныя як прасторы імёнаў XML проста ідэнтыфікатары. ЯНЫ не гарантуецца POINT ні да чаго.
Хоць гэта можа ўвесці ў зман, калі URL-адрасы выкарыстоўваюцца ў якасці імёнаў назвы, гэта відавочна, калі іншыя тыпы спасылак URI выкарыстоўваюцца ў якасці імёнаў назвы. Напрыклад, наступнае аб'яву прасторы імёнаў выкарыстоўваюцца ISBN URN :
XMLNS: ХВЭ = "скрыні: ISBN :0-7897-2504-5"
і наступнае аб'яву прасторы імёнаў выкарыстоўвае UUID URN :
XMLNS: Foo = "скрыні: UUID: f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
Ясна, што ні імёнаў імя паказвае на што-небудзь у Інтэрнэце.
Заўвага: Імёны прастор імёнаў URL-адрасоў, якія могуць паказваць на RDDL дакументаў, хоць гэта і не па ўсёй бачнасці, шырока ўжываюцца. Для атрымання дадатковай інфармацыі гл наступны пытанне.
УВАГА: ранняя версія XML-схем W3C выкарыстоўваць імёны прастор імёнаў, каб паказаць на дакумент схемы XML змяшчае вызначэння тыпаў элементаў і атрыбутаў, указаных у прасторы імёнаў. Аднак, гэта апынулася вельмі спрэчным і ідэя была знятая.
Так.
Вы можаце таксама ёсць трактар, але гэта не азначае, што гэта добрая ідэя. URI спасылак, якія выкарыстоўваюцца ў якасці прасторы імёнаў XML імёны не гарантавана, каб паказаць на што-небудзь, так што, як правіла, няма падстаў для іх вырашэння. Акрамя таго, няма нічога ў апрацоўцы прастор імёнаў XML, што патрабуе ад вас вырашэння гэтых URI спасылак. Нарэшце, як адзначалася ў папярэднім пытанні, многія тыпы прасторы імёнаў з'яўляюцца невырашальнымі ў Інтэрнэце.
Тым не менш, некаторыя людзі выступаюць за размяшчэнне RDDL (Resource Directory Description Language, вымаўляецца як "загадка") дакументы на месцах, на якую паказвае прасторы імёнаў. Дакумент RDDL "падае тэкставае апісанне якога-небудзь класа рэсурсаў і асобных рэсурсаў, звязаных з гэтым класам", у тым ліку такія рэчы, як чалавечая Зразумелая апісанне таго, што апісвае імёнаў і спасылкі на рэсурсы, такія як схемы (у розных мовах), табліцы стыляў, і код. RDDL дакументаў па-відаць, выкарыстоўваецца, хоць і не зразумела, як шырока.
Для атрымання дадатковай інфармацыі аб RDDL і ідэі, якія ляжаць, глядзіце таксама:
Так.
Імёнаў http://www.w3.org/XML/1998/namespace імя, па вызначэнні, звязаны з XML прэфікс. Яна не можа быць незаяўленая або звязаны з любой іншай прэфікс, не можа XML прэфікс быць звязаны з любым іншым прасторы імёнаў. Адзначым, што гэта не з'яўляецца неабходным аб'явіць гэта прастора імёнаў, хоць гэта законна гэта зрабіць.
Імёнаў http://www.w3.org/2000/xmlns/ імя, па вызначэнні, звязаны з прэфіксам XMLNS. Яна не можа быць абвешчанай або неаб'яўленай, не можа XMLNS прэфікс быць звязаны з любым іншым прасторы імёнаў.
Выкарыстанне толькі прасторы імёнаў не працуе па тэхнічных прычынах: URI спасылкі могуць утрымліваць сімвалы, не дапускаецца ў імёнах XML. Напрыклад, выкажам здагадку, імёнаў рэкамендацыі выкарыстоўваюцца толькі URI спасылак. Гэта прывяло б да дакументаў, такіх як:
<http://www.foo.org/:foo>
<http://www.foo.org/:bar />
</http://www.foo.org/:foo>
Гэты дакумент з'яўляецца незаконным, паколькі рысы (/) характару не дапускаецца ў імёны элементаў. Дзве дадатковыя праблемы ў тым, што (а) гэта немагчыма адрозніць двукроп'е (:) у URL з двукроп'я выкарыстоўваюцца для падзелу прасторы імёнаў з лакальнага імя і (б) немагчыма адрозніць рысы ў URL з касая рыса выкарыстоўваецца для завяршэння пусты {} http://www.foo.org бар элемента. Нумары-тэхнічная праблема ў тым, што імёны элементаў цяжка чытаць.
Выкарыстанне толькі прэфіксы не працуе па палітычных прычынах: няма імёнаў орган, які прызначае прэфіксы, таму няма нічога, каб прадухіліць два чалавекі ад выбару і той жа прэфікс. Напрыклад, два розных кампаній, якія ствараюць схемы для заказаў можа як жадаеце выкарыстоўваць "парадак" прэфікс. Без цэнтральнага органа назвы, гэты спрэчка не можа быць вырашана. Выкарыстаньне URI спасылак дазваляе пазбегнуць гэтай праблемы, як URI, знаходзяцца пад кантролем існуючых арганізацый, такіх, як даменнае імя рэестраў і Міжнародным агенцтвам ISBN.
Прасторы імёнаў XML на самай справе не так ужо цяжка зразумець, - усе рэкамендацыі паказвае спосаб карту кваліфікаваных (прэфікс) назвы універсальныя імёны. Вось і ўсё. Нішто іншае. На жаль, большасць людзей, якія даведаюцца аб прасторах імёнаў XML ёсць мінулае з дамовамі аб імёнах і прынесці шмат ідэй з імі. Гэтыя ідэі зрабіць гэта цяжка зразумець прасторы імёнаў XML.
Нават тэрмін імёнаў выклікае праблемы. Прасторы імёнаў XML ўяўляе сабой набор імёнаў, але імёнаў у рэкамендацыі XML нават не казаць пра гэта збор за межы свайго першапачатковага вызначэння. (На самай справе, гэтая калекцыя мае значэння так, што ён нават не згадваецца ў версіі 1.1 рэкамендацыю.) Мы ўсё было б значна лепш, калі б рэкамендацыі былі называецца "Універсальны імёнаў у XML" ці нешта падобнае, што падкрэсліваецца Ідэя універсальных унікальных імёнаў, а любы набор такіх назваў.
Тым не менш, мы можам абмеркаваць асноўныя адключэння кропкі пры вывучэнні прастор імёнаў XML. Ёсць два асноўных момантаў, якія блытаюць людзей:
URL-адрасы ў якасці XML-прасторы імёнаў. Большасць імёнаў XML імёнаў URL-адрасоў. Гэта таму, што URL-адрасы з'яўляюцца найбольш шырока вядомыя і выкарыстоўваюцца выгляд спасылкі URI. На жаль, людзі чакаюць URL-адрасы, каб паказаць на што-то ў Інтэрнэце. Калі яму сказалі, што яны не робяць, яны па праву блытаць. Так што давайце проста паўтарыць гэты момант: XML прастор імёнаў (нават калі яны URL) не паказваюць на што-небудзь. Яны проста ідэнтыфікатары.
Прастата. Прасторы імёнаў XML значна прасцей, чым можна было чакаць. Як ужо адзначалася вышэй, прасторы імёнаў ў рэкамендацыі XML сапраўды забяспечвае толькі адно: спосаб адлюстравання поўных імёнаў для пашыранага імя. На жаль, большасць людзей стараюцца, каб прачытаць больш у рэкамендацыі, чым на самай справе існуе. Для тлумачэння многіх з гэтых рэчаў, гл прастора імёнаў Міфы выбухнуў.
Ёсць шэраг іншых заблытанай кропках, а таксама:
Адсутнасць падтрымкі DTD. DTD, не падтрымліваюць прасторы імёнаў XML. Хоць магчыма для праверкі дакумент, які выкарыстоўвае прасторы імёнаў XML з DTD, якім чынам гэта робіцца парушае дух імёнаў у рэкамендацыі XML. Для атрымання дадатковай інфармацыі см. пытанне 7,6.
Папярэдняе правілаў. Хоць гэта не асабліва цяжка, агляднага правілы сапраўды выклікае некаторае замяшанне. Для атрымання дадатковай інфармацыі па базавым, глядзіце Раздзел 6: Сфера XML аб'явы прасторы імёнаў.
Без прэфікса атрыбуты не ў любым прасторы імёнаў. Гэта неадпаведнасць паміж тым, што імёны элементаў і атрыбутаў разглядаюцца. Гэта, як уяўляецца, было эстэтычнае, а не тэхнічныя, выбар. На жаль, гэта выклікае бязмежную блытаніну. Для атрымання дадатковай інфармацыі см. прастора імёнаў Міф № 4.
Неадпаведнасць паміж тэхналогіямі. Розныя спецыфікацыі лячэння прасторы імёнаў XML-рознаму. Напрыклад, XML-аб'явы прастор імёнаў атрыбутаў у DOM Level 2, але не ў SAX 2.0, і прастора імёнаў па змаўчанні заява не распаўсюджваецца на QNames ў XPath 1.0 выразаў.
QNames як элемента або значэннях атрыбутаў. QNames часта выкарыстоўваюцца ў элемента або значэннях атрыбутаў. Напрыклад, у XML-схем, яны выкарыстоўваюцца для спасылкі на складаныя тыпы і імёны элементаў, якія змяшчаюцца ў мадэлі змесціва. Праблема ў тым, што гэтыя каштоўнасці не разглядаюцца як QNames па тэхналогіі, такія як DOM або SAX. Гэта азначае, дадаткі павінны адсочваць бягучае прастора імёнаў заяў і вырашаць гэтыя QNames сябе.
Дадатковыя крыніцы блытаніны, глядзіце таксама імёнаў жартуеце? Майкл Кей.
Так. Вы можаце вырашаць канфлікты імёнаў проста перайменаванне пакрыўдзіць тыпы элементаў або атрыбутаў, а затым, падчас апрацоўкі, выкарыстоўваючы архітэктурныя формы, каб ператварыць іх у імёны, якія з'яўляюцца recognizeable розных модуляў у дадатку. Хаця вы, магчыма, прыйдзецца перайменаваць некаторыя тыпы элементаў або атрыбутаў, вам не давядзецца мяняць модулі дадатку. Абмеркаванне архітэктурных формаў выходзіць за рамкі дадзенага артыкула. Дадатковыя звесткі см. ў раздзеле архітэктурных формаў і SGML/XML архітэктуры на XML-Вокладка Робін тытульныя старонкі.
Што тычыцца фактычнага сінтаксісу выкарыстоўваюцца прасторы імёнаў XML, ідэя дэкларавання XML прэфіксаў прасторы імёнаў у інструкцыі па апрацоўцы ў пачатку дакумента XML часам пытанні. Інструкцыі па апрацоўцы выкарыстоўваліся ў ранніх праект імёнаў спецыфікацыі XML і перавагамі прастаты (гл. пытанне 4,9). Пазней яны былі заменены больш гнуткімі XMLNS атрыбутаў. Хоць вас можа ўзнікнуць спакуса нанесці ўдар па сваім меркаванні і выкарыстанне інструкцыі па апрацоўцы ці іншай стратэгіі, гэта, верагодна, дрэнная ідэя, хоць і не абавязкова па тэхнічных прычынах. Рэальная праблема ў тым, што прасторы імёнаў XML, ужо шырока выкарыстоўваюцца і падтрымліваюцца, таму любыя XML-дакументы, вырабляць будзе нестандартным і не пераносным.
Неабходна для прасторы імёнаў XML і асноўная ідэя, што сістэма з двух частак наймення (ці нешта падобнае) трэба не спрэчны. Тым не менш, дызайн прасторы імёнаў XML - гэта значыць, шляхам XML Прасторы імёнаў аб'яўляюцца і выкарыстоўваюцца ў дакуменце XML - мае, часам, вельмі спрэчным. (Калі вы хочаце, каб зразумець, наколькі супярэчлівыя, перайдзіце да архіваў спісу рассылання DEV-XML і пошук па слове "імёнаў" або паглядзець на некаторыя з артыкулаў пра Робін крышкі Прасторы імёнаў у XML старонкі.)
Нягледзячы на ??гэтыя праблемы, і той факт, што прасторы імёнаў XML заўсёды будзе мець вельмі вакальны крытыкі, большасць людзей прынялі і выкарыстоўваюць іх. Акрамя таго, практычна ўсе камерцыйныя інструменты XML і тэхналогіі іх падтрымкі.
Рэкамендацыі і іншыя афіцыйныя некалькі рэчаў:
Прасторы імёнаў у XML (рэкамендацыя W3C)
Прасторы імёнаў у XML 01/01 (рэкамендацыі W3C)
Вынікі W3C XML пленарнага галасавання па Адносная URI літаратуры ў дэкларацый прастор імёнаў
ISO/IEC 19757-4 NVDL (прастора імёнаў праверку на падставе Дыспетчарская мова)
Спасылкі на артыкулы пра XML прасторах назваў:
Артыкулы пра XML прасторах назваў:
Прастора імёнаў Міфы разабраным Рональд Бурре
Прасторы імёнаў XML у прыкладах Цім Брей
Прасторы імёнаў XML Джэймсам Кларкам
Заклік да Sanity Джо ангельску
Прасторы імёнаў XML-схемы W3C Мэцью Фукс
RDDL мне: Што такое прастора імёнаў URL Знайдзіце? па Эліат Расці Харольд
План выкарыстання прасторы імёнаў XML, частка 1 і частка 2 Дэвід Марстон
Прастора імёнаў Падручнік па Милослав Nic
Праца з прасторамі імёнаў у XML-схемы па Dare Obasanjo
Прасторы імёнаў і версій па улікам Ogbuji
Выкарыстаньне прасторы імёнаў XML з асцярогай па улікам Ogbuji
Прастора імёнаў Нюансы Джон Э. Сімпсан
XML-файлы: разуменне прасторы імёнаў XML Аарон Skonnard
XML-схемы: разуменне прасторы імёнаў па Rahul Шривастава
XML-схемы: Мэта elementFormDefault? Генры Томпсан
XML-схемы: Best Practices членамі Dev спіс рассылкі-XML, у прыватнасці:
Кампутары: Фарматы дадзеных: Мовы перадзелу: XML: Прасторы імёнаў ад адкрытага праекта Directory
Іншыя спасылкі вітаюцца.
Практычна ўсе камерцыйнае праграмнае забеспячэнне зараз падтрымлівае XML Прасторы імёнаў XML.
Наступныя прызначаныя утыліты для працы з XML прасторах назваў:
XML Cleaner з'яўляецца "ўтыліта каманднага радка для фільтрацыі і праверкі XML-файлаў", які таксама выдаляе лішнія аб'явы прасторы імёнаў.
Калі ў вас ёсць заўвагі, скаргі ці прапановы для новых пытанняў, вы можаце адправіць іх мне (Рональд Бурре) на rpbourret@rpbourret.com.
Дзякуючы Петэры Астра, Юрген Ауэр, Адрыян Бойка, Цім Брэй, Дэрэк Денні-Браўн, Боб Дюшарм, Кен Goldman, Сэм Паляванне, Мадхава Lakkapragada, Андрэй Лайман, Густаў Liljegren, Крыстафер Лот, Марк Макдональд, Андэрс Моллер, Рэндзі Нікалс, Джым Палмер, Ganesan Радхакришнан, Арджун Ray, Арон Робертс, Уэйн Стыл, Рычард Тобін, Эрык Уайльд, і Дивакар Yammanuru за іх уклад.
Popular Links