【问题标题】:Global declarations within Xml SchemaXml Schema 中的全局声明
【发布时间】:2010-10-22 06:32:43
【问题描述】:

a) 为什么全局元素和属性声明必须始终属于命名空间,因此必须始终在实例文档中进行限定?

b) 本地元素/属性声明(其 form 属性设置为 unqualified)是否仍然是模式的目标命名空间的一部分,即使它们与实例文档中的任何命名空间都没有关联?

c) 即使类型/组声明是全局的,它仍然是目标命名空间的一部分,因此在引用全局声明时,我们必须包含目标命名空间前缀。

无论如何,全局声明是目标命名空间的一部分,而局部声明不是,有什么特别的原因吗?也就是说,即使全局类型/组声明不属于目标命名空间,我们仍然可以在 Xml Schema 中引用它们,所以它们成为命名空间的一部分一定还有其他好处吗?!

谢谢

编辑:

@user437291: 如果你理解 命名空间的概念和 限定名称为什么使用单词 “本地”和“全球”这不是一个 概念的一部分?

但是为什么局部类型声明需要是 Xml Schema 的目标命名空间的成员呢?它们没有从实例文档或其他 Xml 模式中引用,那么它们作为目标命名空间的成员的目的/好处是什么?

此外,问题是否 元素或属性属于 命名空间真的独立于 其“资格”。这是 不同的属性,如颜色和 大小的东西。

一个元素/属性如何属于一个命名空间,同时又不必在实例文档中进行限定?在编程语言中,如果类型T 是命名空间N1 的成员,则意味着它的完全限定名称是N1.T,因此其他类型需要使用完全限定名称N1.T(这里我' m 忽略 using 指令等)。

我希望它与 Xml Schemas 和 xml 实例文档相同 - 因此,据我了解,当 Xml Schema 验证器解析 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>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    在我看来,您的问题与对特殊命名空间的理解有关:“无命名空间”。在以下简单的 XML 文档中

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

    rootmyElement 元素都具有名为“无命名空间”的特殊命名空间。可以定义对应的 XML Schema:

    <?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>
    

    因为在schema中没有用到targetNamespace,所以schema定义了“no namespace”的schema。

    顺便说一下,模式“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>
    

    现在我们有了一个对我们使用的架构的显式引用。

    关于限定元素名称或限定属性名称的问题与您的主要问题无关。这很容易解释。 qualified names 只不过是带有 命名空间前缀 的名称,例如 &lt;xs:element&gt;xsi:noNamespaceSchemaLocation="NoNamespace.xsd"。所以 qualified 既可以是元素,也可以是属性。

    在一个文档中,您可以混合属于不同命名空间的元素。例如在以下文档中

    <?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>
    

    元素&lt;html&gt; 及其子元素具有“http://www.w3.org/1999/xhtml”命名空间,并且应该针对众所周知的 XHTML 模式进行验证。元素 &lt;root&gt;&lt;myElement&gt; 具有“无名称规范”。元素 &lt;myChild&gt;&lt;mySecondChild&gt; 具有命名空间“http://www.ok-soft-gmbh.com/xsd/test/123”。元素&lt;mySubChild&gt;&lt;x&gt; 元素也具有“无名称规范”,如&lt;root&gt;&lt;myElement&gt;。所以一切都很简单。

    更新:如果我理解您更正了在 XML Schema 中定义的所有类型,那么您的定义中将是“全局”的。您不能定义“内部”或“私有”类型。

    我不确定您在示例中包含的 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 模式说 "http://www.someDomain.com" 中的 &lt;contact&gt; 元素必须有两个子元素:targetNamespace "http://www.someDomain.com" 中的 firstName 和 "no namespace" 中的元素 lastName ”。希望对你有帮助。

    【讨论】:

    • 您好,感谢您的帮助,但除了告诉我特殊命名空间“无命名空间”之外,您还没有真正解决我的问题。也就是说,我已经知道了你解释的所有内容。
    • @user437291:如果您了解名称空间和限定名称的概念,为什么要使用不属于该概念的“本地”和“全局”一词?此外,元素或属性是否属于命名空间的问题实际上与它的“限定”无关。它是不同的属性,例如某物的颜色和大小。可能如果你用一个例子来描述你的问题,一切都会更清楚。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2019-04-15
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多