XSD targetNamespace не переопределяет пространство имен элемента? - PullRequest
1 голос
/ 28 марта 2019

У меня есть XSD, который определяет сложный тип и имеет атрибут targetNamespace.Правильно ли, что TestElement не получит пространство имен, установленное targetNamespace?Он должен получить пространство имен от сложного типа afn:ElementType и, следовательно, http://anotherfancy.namespace, верно?

   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:sfn="http://somefancy.namespace"
            xmlns:afn="http://anotherfancy.namespace"
            attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            targetNamespace="http://somefancy.namespace"
            version="1.0">
      <xs:import namespace="http://anotherfancy.namespace" schemaLocation="..."/>
      <xs:element name="MyComplexType">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="TestElement" type="afn:ElementType">
               </xs:element>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
   </xs:schema>

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Пространство имен элемента, объявленного в объявлении локального элемента, приводится в следующем правиле (XSD 1.1 часть 1 §3.3.2.3)

{target namespace}

The appropriate case among the following:
1 If targetNamespace is present [as an attribute of the xs:element element], then its ·actual value·.
2 If targetNamespace is not present and one of the following is true
2.1 form = qualified
2.2 form is absent and the <schema> ancestor has elementFormDefault = qualified
then the ·actual value· of the targetNamespace [attribute] of the ancestor <schema> element information item, or ·absent· if there is none.
3 otherwise ·absent·.

Атрибут targetNamespace для xs:element является новым в 1.1, поэтому для 1.0 вы можете игнорировать правило 1.

Атрибут form xs:element используется очень редко, но если значение равно qualified, то элемент попадает в пространство имен targetName, объявленное в содержащем xs:schema, тогда как если оно равно unqualified, то оно идет ни в каком пространстве имен. Если form не указано (что почти всегда так), то по умолчанию используется значение elementFormDefault для элемента xs:schema. Обычно это значение равно qualified, поэтому элемент попадает в целевое пространство имен схемы; но по умолчанию (к сожалению) это unqualified, что означает, что оно не идет ни в какое пространство имен.

1 голос
/ 28 марта 2019

Когда xs:schema/elementFormDefault="qualified"

(Как и в вашем случае, это также рекомендуемая и наиболее часто используемая настройка elementFormDefault.)

элементы , объявленные в XSD, должны находиться в пространстве имен, заданном в XSD targetNamespace.

Поэтому для вашего XSD TestElement должно быть в http://somefancy.namespace для того, чтобы документ XML был действительным.Если вы хотите, чтобы он был в http://anotherfancy.namespace, объявите элемент в импортированном XSD;сохраняя его type , сам элемент не будет помещен в это другое пространство имен.После объявления TestElement в импортированном пространстве имен его можно использовать в исходном пространстве имен с помощью xs:element/@ref.

См. Также Как ссылаться на элемент в пространстве имен другого XSD?

Для редко необходимых и обычно не рекомендуемых других вариантов

См. Ответ Майкла Кея здесь и мой более длинный ответ на этот вопрос: Что означаетelementFormDefault делать в XSD?

...