Я хотел бы понять цель targetNamespace, которая используется как в XML-схеме, так и в WSDL. На самом деле, чтобы все было просто, позвольте ограничить этот вопрос XML-схемой.
Мне кажется, что я полностью понимаю понятие (простых) пространств имен XML. По соглашению мы используем URI/URL, но мы можем использовать любую строку, которую затем назначаем префикс для повторного использования узлами и атрибутами XML или просто используем пространство имен по умолчанию для области действия. До сих пор, так хорошо?
Теперь вводится XML-схема. По каким-то причинам изобретатели XML Schema считали, что понятия простых пространств имен недостаточно, и им нужно было ввести targetNamespace. Мой вопрос: какое существенное преимущество представляет собой представление targetNamespace, которое не может быть обеспечено обычным пространством имен XML? Если XML-документ ссылается на документ xsd, либо с помощью schemaLocation, либо с помощью оператора import, в любом случае я даю путь к фактическому документу xsd, на который ссылаются. Это то, что однозначно определяет схему, на которую я хочу ссылаться. Если, кроме того, я хочу привязать эту схему к определенному пространству имен в моем справочном документе, почему я должен быть обязан реплицировать точное целевое пространство имен, уже определенное в XML-схеме, на которую я ссылаюсь? Почему я не могу просто переопределить это пространство имен, но я хочу, чтобы в документе XML, в котором это пространство имен будет использоваться для ссылки на этот конкретный документ XML-схемы, который я хочу ссылаться?
Update:
Чтобы привести пример, если в документе экземпляра XML есть следующее:
<p:Person
xmlns:p="http://contoso.com/People"
xmlns:v="http://contoso.com/Vehicles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://contoso.com/schemas/Vehicles
http://contoso.com/schemas/vehicles.xsd
http://contoso.com/schemas/People
http://contoso.com/schemas/people.xsd">
<name>John</name>
<age>28</age>
<height>59</height>
<v:Vehicle>
<color>Red</color>
<wheels>4</wheels>
<seats>2</seats>
</v:Vehicle>
</p:Person>
Почему, например, в схеме people.xsd необходимо определить целевое пространство имен, которое "http://contoso.com/schemas/People"? Зачем нам вообще нужно определение targetNamespace в документе xsd? Мне кажется, что все, что вам нужно получить из части пространства имен схемы, уже содержится в документе экземпляра XML. В чем преимущество обеспечения существования targetNamespace с равным значением в документе xsd?
Последующий вопрос Павлу:
Можете ли вы дать мне конкретный пример, где такие "столкновения" между именами элементов xsd становятся очевидными, и это объясняет необходимость в targetNamespace?
Хорошо, вот попытка ответить на мой собственный вопрос. Дайте мне знать, если это кажется вам последовательным. Глядя на примеры на странице, связанной с Павлом, помог мне.
Если мы возьмем пример экземпляра XML в исходном вопросе выше, у нас есть две ссылки на определение элемента транспортного средства. Один из них является явным и видимым в самом документе экземпляра XML, но мы также должны представить, что XML-схема person.xsd ссылается на одно и то же определение транспортного средства как на разрешенный дочерний элемент человека. Если бы мы использовали обычные пространства имен, где каждому документу было разрешено определять собственное пространство имен для транспортного средства, как мы узнаем, что экземпляр XML ссылается на одно и то же определение схемы XML для транспортного средства, как и на man.xsd? Единственный способ - это использовать концепцию пространства имен, которая является более строгой, чем первоначальная простая, и которая должна быть написана точно так же в нескольких документах.
Если бы я не писал это на планшете, я бы представил пример кода, но здесь я просто попытаюсь описать пример, который я имею в виду.
Представьте, что у нас есть два разных определения схемы XML для элемента транспортного средства. location1/vehicles.xsd будет содержать определение, подтверждающее пример из вопроса об этом сообщении (содержащий цвет, колеса и элементы детского элемента), тогда как location2/vehicles.xsd будет содержать совершенно другое определение для элемента транспортного средства (например, с дочерними элементами год, модель и объем). Теперь, если документ экземпляра XML ссылается на схему location1, как это имеет место в примере выше, но person.xsd говорит, что элемент person может содержать дочерний элемент транспортного средства типа, определенного в схеме Location2, а затем без понятия объекта targetNamespace, экземпляр XML будет проверять, даже если он явно не имеет подходящего типа транспортного средства в качестве дочернего элемента его персонального элемента.
Затем пространство имен имен поможет нам убедиться, что если два разных документа ссылаются на одну и ту же третью схему XML, они оба находятся на деле, ссылаясь на одну и ту же схему, а не только на схему, содержащую элементы, похожие, но не идентичные другой...
В этом смысл?