xs:extension 导致我的元素停止强制执行其类型
The xs:extension causes my element to stop enforcing its type
我在 XSD 文件“strict”中有一个简单元素,它只接受布尔值,但是当我使用 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 的一个非常基本的方面。
参考:
- XML & XSD validation failed: Element has both a 'type' attribute and a 'anonymous type' child
- 不幸的是,这个答案没有讨论类型。
更新:
在@kjhughes 的帮助下 - 确定这可能是一个 IntellJ 错误。 https://youtrack.jetbrains.com/issue/IDEA-257186
你的 XSD 声明是声明 strict
元素应该有一个属性的正确方法(虽然你没有包含它的声明,所以我们无法验证它的正确性)并且有内容输入 xs:boolean
.
另请参阅:
你认为这个 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"
)。如果上述方法不起作用,请怀疑该工具或其配置。
我在 XSD 文件“strict”中有一个简单元素,它只接受布尔值,但是当我使用 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 的一个非常基本的方面。
参考:
- XML & XSD validation failed: Element has both a 'type' attribute and a 'anonymous type' child
- 不幸的是,这个答案没有讨论类型。
更新: 在@kjhughes 的帮助下 - 确定这可能是一个 IntellJ 错误。 https://youtrack.jetbrains.com/issue/IDEA-257186
你的 XSD 声明是声明 strict
元素应该有一个属性的正确方法(虽然你没有包含它的声明,所以我们无法验证它的正确性)并且有内容输入 xs:boolean
.
另请参阅:
你认为这个 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"
)。如果上述方法不起作用,请怀疑该工具或其配置。