【问题标题】:Extend an XML Schema via the <any> element通过 <any> 元素扩展 XML Schema
【发布时间】:2018-06-26 14:20:34
【问题描述】:

XML 架构定义中的&lt;any&gt; 元素允许一个架构被另一个架构扩展。

我尝试按照https://www.w3schools.com/xml/schema_complex_any.asp 给出的示例进行操作。

但是,只要 children 元素不是命名空间限定的,IntelliJ 就会给我验证错误消息“匹配的通配符是严格的,但找不到元素 'children' 的声明”。我可以通过将 'xmlns="https://www.w3schools.com"' 添加到 children 元素来消除此错误。虽然这很有意义,但我真的很喜欢“插入式”扩展的可能性,而无需指定命名空间。我缺少一些隐藏的功能吗?还是示例有缺陷,您总是需要明确指定命名空间?

我正在使用 IntelliJ 编辑和验证 XML Schema 和 XML 文件,并激活了 XML Schema 1.1。

我对示例中的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”元素指定命名空间的情况下工作?

感谢您的提示和想法!

【问题讨论】:

  • 请不要告诉我们它不起作用。告诉我们它是如何失败的。您有什么要求此架构无法满足?
  • 对不起,我应该更具体一些。我更新了问题。到目前为止,我只想清楚地了解在使用另一个模式中定义的元素扩展一个模式的上下文中的“任何”机制。
  • 感谢您添加故障症状。这将更容易看出问题所在。它似乎在“processContents”区域而不是命名空间。

标签: xml xsd schema


【解决方案1】:

“模式限定”我怀疑你的意思是“命名空间限定”。

如果您想允许任何命名空间中的元素或不允许元素,请使用&lt;xs:any namespace="##any"/&gt;

稍后

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

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

在 W3Schools 示例中,实例文档具有用于 children 元素命名空间的 xsi:schemaLocation 属性,该属性指向包含该元素声明的模式。因为processContents="strict",所以需要该模式。命名空间是什么并不重要,只要存在全局元素声明即可。

【讨论】:

  • 感谢您的回答。你完全正确,我的意思是命名空间限定并相应地编辑了问题。据我了解,##any 是命名空间属性的默认值。它将允许我使用来自另一个命名空间的元素,而不是原始模式所涉及的元素。现在问题仍然存在:在 W3Schools 示例中,似乎没有明确的命名空间限定。由于“找不到声明”错误,我无法重现。问题是:我做错了什么还是示例缺少命名空间限定?
  • 感谢您稍后的回答。我们更接近我的问题的核心问题,即“全局元素声明”。如果我理解正确,您建议在&lt;any&gt; 元素上将processContents 设置为lax。如果我这样做,验证错误将消失。但是,IntelliJ 然后显示 children.xsd 模式未使用。事实上,我现在可以将任何内容添加到 children 元素中而不会出现任何验证错误。我所希望的是自动识别 children.xsd 定义了 children 元素并针对该元素的 children.xsd 进行验证。
  • 由于验证松懈,您无法添加任何内容而不会出现任何错误。您可以添加没有架构定义的元素,也可以添加符合其架构定义的元素;您不能添加具有架构定义但不符合它的元素。
  • 没错,但是,我的观点正是我添加一个没有命名空间限定的元素的情况:在使用宽松验证时,它总是会被接受而无需任何验证尝试。这是确切的原始问题:如果没有在本地给定 children 元素这个命名空间,我能否针对全局指定的模式进行验证。看来答案是no。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 2014-02-14
  • 2020-06-19
  • 1970-01-01
  • 2021-05-06
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多