Xml模式中的全局声明
a) 为什么全局元素和属性声明必须始终属于名称空间,因此必须始终在实例文档中限定 b) 本地元素/属性声明(其Xml模式中的全局声明,xml,xsd,Xml,Xsd,a) 为什么全局元素和属性声明必须始终属于名称空间,因此必须始终在实例文档中限定 b) 本地元素/属性声明(其表单属性设置为非限定)是否仍然是架构目标命名空间的一部分,即使它们与实例文档中的任何命名空间都没有关联 c) 即使类型/组声明是全局的,它仍然是目标命名空间的一部分,因此在引用全局声明时,我们必须包含目标命名空间前缀 无论如何,全局声明是目标命名空间的一部分而本地声明不是,这有什么特别的原因吗?也就是说,即使全局类型/组声明不属于目标名称空间,我们仍然可以在Xml模式中引用它们,因此它们
表单
属性设置为非限定
)是否仍然是架构目标命名空间的一部分,即使它们与实例文档中的任何命名空间都没有关联
c) 即使类型/组声明是全局的,它仍然是目标命名空间的一部分,因此在引用全局声明时,我们必须包含目标命名空间前缀
无论如何,全局声明是目标命名空间的一部分而本地声明不是,这有什么特别的原因吗?也就是说,即使全局类型/组声明不属于目标名称空间,我们仍然可以在Xml模式中引用它们,因此它们成为名称空间的一部分肯定还有其他好处
多谢各位
编辑:
@用户437291:如果您理解 名称空间的概念和 限定名称为什么要使用单词 “本地”和“全球”,这不是 概念的一部分 但为什么本地类型声明必须是Xml模式的目标命名空间的成员呢?它们不是从实例文档或其他Xml模式中引用的,因此它们作为目标命名空间的成员的目的/好处是什么 此外,问题是 元素或属性属于 名称空间实际上独立于 该委员会的“资格”。它是 不同的属性,如颜色和颜色 某物的大小 一个元素/属性如何属于一个名称空间,同时又不必在实例文档中进行限定?在编程语言中,如果类型
T
是命名空间N1
的成员,这意味着它的完全限定名是N1.T
,因此其他类型需要使用完全限定名N1.T
(这里我忽略使用指令等)
我希望Xml模式和Xml实例文档也是如此——因此,据我所知,当Xml模式验证器解析Contacts.Xml
遇到限定元素contact:firstName
,它会使用名称搜索Contacts.xsd
以查找匹配的元素声明
在找到匹配项后,验证程序接着处理Contacts.xml
中的下一个元素,即lastName
。看到lastName
元素是unqualified
,它在Contacts.xsd
中搜索名为lastName
的元素声明。现在,如果在Contacts.xsd中,它的完全限定名是http://www.someDomain.com.lastName
,则验证程序将无法找到匹配的声明!但它确实找到了一个匹配的声明,所以我假设lastName
不是名称空间的成员
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>
在我看来,你的问题与对特殊名称空间的理解有关:没有名称空间“。在下面的简单XML文档中
<?xml version="1.0" encoding="utf-8"?>
<root>
<myElement>Bla Bla</myElement>
</root>
因为在模式中没有使用它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>
元素
及其子元素具有“http://www.w3.org/1999/xhtml“命名空间,并且应该根据众所周知的XHTML模式进行验证。元素
和
具有“无名称规范”。元素
和
具有名称空间“http://www.ok-soft-gmbh.com/xsd/test/123". 元素
和
元素也有类似
和
的“无名称规范”。所以一切都很简单
更新:如果我理解您更正了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
是在schemaContacts.xsd
中定义的,但它被定义为来自“no namespace”的元素。XML模式表示来自的
元素http://www.someDomain.com“
必须有两个子元素:firstName
来自targetNamespace
”http://www.someDomain.com以及“无命名空间”中的元素lastName
。我希望它能对您有所帮助。您好,我感谢您的帮助,但除了告诉我特殊名称空间“无名称空间”之外,您还没有真正回答我的问题。名义上,我已经知道你解释的所有内容。@user437291:如果你理解名称空间和限定名称的概念,为什么要使用“本地”和“全局”这两个词,而这两个词不是概念的一部分?此外,元素或属性是否属于名称空间的问题实际上与它的“限定”无关。它是不同的属性,如颜色和大小的东西。也许如果你用一个例子来描述你的问题,一切都会更清楚。
<?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>
<?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>