通过<any>元素

时间:2018-06-26 14:20:34

标签: xml xsd schema

XML模式定义中的<any>元素允许一个模式被另一个模式扩展。

我尝试遵循https://www.w3schools.com/xml/schema_complex_any.asp中给出的示例。

但是,只要children元素不是名称空间限定的IntelliJ,就会向我显示验证错误消息“匹配的通配符是严格的,但找不到元素'children'的声明”。我可以通过在children元素中添加“ xmlns =“ https://www.w3schools.com””来消除此错误。尽管这很有意义,但我真的很希望无需指定名称空间即可使用“直接插入”扩展。我缺少一些隐藏功能吗?还是该示例存在缺陷,您始终需要显式指定名称空间?

我正在使用IntelliJ在激活XML Schema 1.1的情况下编辑和验证XML Schema和XML文件。

我对示例中的family.xsd片段进行了如下补充:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.microsoft.com"
           targetNamespace="http://www.microsoft.com"
           elementFormDefault="qualified">

    <xs:element name="persons">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="person" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="firstname" type="xs:string"/>
                            <xs:element name="lastname" type="xs:string"/>
                            <xs:any minOccurs="0"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

问题是:W3Schools示例是否存在缺陷,还是应该在不为'children'元素指定名称空间的情况下工作?

感谢您的提示和想法!

1 个答案:

答案 0 :(得分:1)

通过“模式限定”,我怀疑您的意思是“名称空间限定”。

如果要允许任何名称空间中的元素或不包含任何元素,请使用<xs:any namespace="##any"/>

LATER

namespace='##any'确实是默认设置,所以这似乎不是问题。

现在您已经告诉我们错误消息,该错误消息指向processContentsprocessContents的默认值为strict,这意味着仅当存在全局元素声明(并且该声明必须对该声明有效)时,才允许该元素。

在W3Schools示例中,实例文档具有xsi:schemaLocation元素的命名空间的children属性,该属性指向包含该元素声明的架构。因为processContents="strict",所以需要该架构。只要存在全局元素声明,名称空间就无关紧要。