Після ретельного тестування за допомогою xmllint, я думаю, я знайшов тут чітке пояснення. Розглянемо наведену нижче схему:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns:p="http://abced.com"
xmlns:q="http://pqr.com"
xmlns="http://yyyzzz.com">
<xsd:element name="recipe" type="recipeType" />
<xsd:complexType name="recipeType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="desc" type="xsd:string" />
<xsd:attribute name="archetype" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
Вищевказана схема перевіряє документ нижче:
<?xml version="1.0"?>
<recipe xmlns="http://yyyzzz.com">
Deciphering the purpose of targetNamespace
</recipe>
Причина, яка працює, полягає в тому, що xmlns = "http://yyyzzz.com" автоматично прив'язується до елемента, який також визначається схемою! Це означає, що він також прив'язується до елемента receptType .
Тепер, з тим самим документом xml, але з трохи зміненою схемою, як показано нижче, також перевіряється та уважно розглядається різниця:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://yyyzzz.com"
xmlns="http://eigenfield.aparicio.com"
xmlns:EGboy="http://yyyzzz.com">
<xsd:element name="recipe" type="EGboy:recipeType" />
<xsd:complexType name="recipeType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="desc" type="xsd:string" />
<xsd:attribute name="archetype" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>
Ігноруйте, якщо інші xmlns зникли, але натомість уважно подивіться на type = "EGboy: recipeType" . Ми більше не можемо покладатися на xmlns, оскільки він має різне значення, тому ми повинні поставити префікс EGboy перед receptuType .
Документ xml навіть не піклується про префікс EGboy; цей префікс призначений лише для того, щоб схема посилалася на належні xmlns, якщо їх багато.