【问题标题】:The xs:extension causes my element to stop enforcing its typexs:extension 导致我的元素停止强制执行其类型
【发布时间】:2021-03-17 01:16:25
【问题描述】:

我在 XSD 文件“严格”中有一个简单元素,它只接受布尔值,但是当我使用 xs:extension 时,不再强制执行该类型。

这里声明没有属性:

<xs:element name="strict" type="xs:boolean"/>

并且正确地执行了 xml。即:

<strict>false</strict> <!-- succeeds -->
<strict>XXXXX</strict> <!-- fails    -->

还有属性:

<xs:element name="strict"> <!-- purposely needed to remove type from this line -->
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:boolean"> <!-- the base is the same as the previous type -->
                <xs:attribute ref="operation"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

然后我这里故意的坏元素不再强制执行。

<strict operation="none">XXXXX</strict> <!-- succeeds...         -->
<strict operation="none">false</strict> <!-- succeeds as well... -->

我注意到,当我使用xs:extension 时,我不能再将type 放入我的xs:element,并且我认为base="xs:boolean" 会覆盖我,但事实并非如此。

我的最终目标:允许 xs:element 中的属性并强制执行数据类型

注意: 我正在使用 IntelliJ XML/XSD 功能通过使用它的内部 lint 引擎突出显示错误来帮助指导我。所以这可能是 IntelliJ 在到期时给出错误(或不给出错误)?非常值得怀疑,因为我觉得这是 XML 的一个非常基本的方面。

参考:

更新: 在@kjhughes 的帮助下 - 确定这可能是一个 IntellJ 错误。 https://youtrack.jetbrains.com/issue/IDEA-257186

【问题讨论】:

    标签: xml intellij-idea xsd xsd-validation xml-validation


    【解决方案1】:

    您的 XSD 声明是声明 strict 元素应具有属性(尽管您未包含其声明,因此我们无法验证其正确性)并具有 xs:boolean 类型的内容的正确方法。

    另请参阅:How to define a simple element and attribute in XSD

    你认为这个 XML 是正确的

    <strict operation="none">XXXXX</strict>
    

    应该会失败。我已经通过一个完整的示例验证它确实失败了:

    XSD

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <xs:element name="strict">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:boolean">
              <xs:attribute name="operation" type="xs:string"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    如果上述方法在您的验证设置中对您有效,则怀疑您遗漏了有关 XSD 缺失部分的错误(例如 ref="operation")。如果上述方法不起作用,请怀疑该工具或其配置。

    【讨论】:

    • 嗯,您使用哪种验证设置?
    • 这次它碰巧是一个简单的基于 Xerces 的验证工具,但是您会发现任何兼容的 XSD 验证器都可以得到相同的结果:Saxon、oXygen XML 等。
    • 所以你发布的代码和我的差不多(除了操作属性是直接定义的)。这很好,它告诉我我在做什么是正确的,但也许 IntellJ 的 XML 验证工具有问题?
    • 是的,我希望您可以使用这个完整的、已知良好的 XSD 来进一步调试工作。如果 IntelliJ 在验证 XSD 时遇到问题,并且您已正确配置验证,则故障似乎出在 IntelliJ 上。但是,您应该进一步按下以确保正在进行验证。使用上述 XSD,请确保您可以强制执行受控验证错误,以证明 XSD 已被找到并应用。 (预期没有验证错误可能仅仅意味着验证根本没有发生。)
    • 将此错误报告给 IntellJ youtrack.jetbrains.com/issue/IDEA-257186
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多