Глобальные объявления в XML-схеме - PullRequest
2 голосов
/ 20 октября 2010

a) Почему глобальные объявления элементов и атрибутов всегда должны принадлежать пространству имен и, как таковые, всегда должны указываться в экземплярах документов?

b) Являются ли объявления локальных элементов / атрибутов (для атрибутов form которых установлено значение unqualified) по-прежнему частью целевого пространства имен схемы, даже если они не связаны с каким-либо пространством имен в документах экземпляра?

c) Даже если объявление типа / группы является глобальным, оно все равно является частью целевого пространства имен, и поэтому при обращении к глобальным объявлениям мы должны включать префикс целевого пространства имен.

В любом случае, есть ли конкретная причина, по которой глобальные объявления являются частью целевого пространства имен, а локальные - нет? А именно, даже если глобальные объявления типа / группы не будут принадлежать целевому пространству имен, мы все равно можем ссылаться на них в нашей XML-схеме, поэтому должны быть другие преимущества, чтобы они были частью пространства имен?!

Спасибо

EDIT:

@ user437291: Если вы понимаете Понятие пространства имен и квалифицированное имя, почему вы используете слова «местный» и «глобальный», который не является часть концепции?

Но почему объявления локальных типов должны быть членами целевого пространства имен схемы XML? На них нет ссылок из документов экземпляра или других схем XML, так какова цель / преимущество их членства в целевом пространстве имен?

Кроме того, вопрос, является ли элемент или атрибут принадлежат пространство имен действительно не зависит от его "квалификация". это различные свойства, такие как цвет и размер чего-то.

Как элемент / атрибут может принадлежать пространству имен и в то же время не должен быть квалифицирован в документах экземпляра? В языках программирования, если тип T является членом пространства имен N1, это означает, что его полностью определенное имя - N1.T, и поэтому другие типы должны ссылаться на этот тип, используя полностью определенное имя N1.T (здесь я ' м игнорируя директивы using и т. д.).

Я ожидаю, что то же самое с XML-схемами и документами экземпляра xml - таким образом, насколько я понимаю, когда синтаксический анализатор Xml-схемы Contacts.xml встречает квалифицированный элемент contact:firstName, он ищет Contacts.xsd для соответствующего объявления элемента, используя имя http://www.someDomain.com.firstName.

После того, как найдено совпадение, валидатор затем переходит к следующему элементу в Contacts.xml, который равен lastName. Видя, что элемент lastName равен unqualified, он ищет в Contacts.xsd объявление элемента с именем lastName. Теперь, если в пределах Contacts.xsd его полное имя было http://www.someDomain.com.lastName, то валидатор не сможет найти соответствующее объявление! Но он находит соответствующее объявление, поэтому я предполагаю, что lastName не является членом пространства имен http://www.someDomain.com

Contacts.xml

<?xml version="1.0" encoding="UTF-8"?>
<contact:contact      
     xmlns:contact="http://www.someDomain.com"
     xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
     xs:schemaLocation="http://www.someDomain.com contacts1.xsd">
            <contact:firstName></contact:firstName>
            <lastName></lastName>         
</contact:contact>

Contacts.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.someDomain.com"  targetNamespace="http://www.someDomain.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="contact">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="firstName" />
                <xs:element name="lastName" form="unqualified"/>        
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

1 Ответ

4 голосов
/ 21 октября 2010

Мне кажется, что ваш вопрос связан с пониманием специального пространства имен: "нет пространства имен" .В следующем простом XML-документе

<?xml version="1.0" encoding="utf-8"?>
<root>
    <myElement>Bla Bla</myElement>
</root>

элементы root и myElement имеют специальное пространство имен, названное "no namespace".Вы можете определить соответствующую XML-схему:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myElement" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Поскольку в схеме она не используется targetNamespace, схема определяет схему "без пространства имен".

Кстатисхема "http://www.w3.org/2001/XMLSchema-instance" дает вам простой способ ссылаться на схему из XML-документа. Давайте сохраним вышеуказанный документ схемы в файле NoNamespace.xsd, а XML-документ мы сохраним в файле NoNamespace.xml. Кроме того, мы помещаемоба файла в одной папке. Затем мы можем изменить XML-документ на следующий

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="NoNamespace.xsd">
    <myElement>Bla Bla</myElement>
</root>

Теперь у нас есть явная ссылка на схему, которую мы используем.

Вопрос о квалифицированных именах элементов или квалифицированных именах атрибутов не зависит от вашего основного вопроса. Его очень легко объяснить. квалифицированных имен не более, чем имена с префиксом namespace как <xs:element> или xsi:noNamespaceSchemaLocation="NoNamespace.xsd". Таким образом, квалифицированный может быть как элементом, так и атрибутом.

В одном документе вы можете смешивать элементы, относящиеся к другому пространству имен.Например, в следующем документе

<?xml version="1.0" encoding="utf-8"?>
<root>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <body>
            <p>Hello!</p>
        </body>
    </html>
    <myElement>
        <myChild xmlns="http://www.ok-soft-gmbh.com/xsd/test/123">
            <mySubChild xmlns="">
                <x></x>
            </mySubChild>
            <mySecondChild>Hello!<mySecondChild>
        </myChild>
    </myElement>
</root>

элемент <html> и его дочерние элементы имеют пространство имен "http://www.w3.org/1999/xhtml"", и его следует проверить по известной схеме XHTML.Элементы <root> и <myElement> не имеют "namespece".Элементы <myChild> и <mySecondChild> имеют пространство имен "http://www.ok -soft-gmbh.com / xsd / test / 123".Элемент <mySubChild> вместе с элементом <x> также не имеет "namespece", как <root> и <myElement>.Так что все очень просто.

ОБНОВЛЕНО : Если я понимаю, вы исправляете все типы, определенные в схеме XML, будут "глобальными" в вашем определении.Вы не можете определить «внутренний» или «закрытый» типы.

Я не уверен, в чем заключается ваш вопрос к XML-файлу и схеме XSD, которые вы включили в свой пример.Возможно, вам будет полезно переписать XML-файл, используя ту же схему, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<contact xmlns="http://www.someDomain.com"
         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
         xs:schemaLocation="http://www.someDomain.com Contacts.xsd">
    <firstName></firstName>
    <lastName xmlns=""></lastName>
</contact>

Таким образом, элемент lastName определен в схеме Contacts.xsd, но определен какэлемент из "пространства имен".Ваша XML-схема говорит, что элемент <contact> из "http://www.someDomain.com" должен иметь два дочерних элемента: firstName из targetNamespace "http://www.someDomain.com" и элемент lastName из" no namespace ". Надеюсь, это поможетвы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...