我正在尝试为以下XML示例编写XSD架构:
<?xml version="1.0" encoding="UTF-8"?>
<locs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="loc.xsd">
<loc required="true" comment="A comment">ABC</loc>
</locs>
我试图在架构中强制执行这些规则的规则:
locs
必须包含一个或多个loc
loc
必须有2个属性:required
是boolean
&amp; comment
是string
,长度非零,不完全由空格和/或标点符号组成loc
必须有一个非零长度的字符串值,不完全由空格和/或标点符号组成我的loc.xsd
如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="locs">
<xs:complexType>
<xs:sequence>
<xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:complexContent>
<xs:extension base="xs:string">
<xs:attribute name="required" type="xs:boolean" use="required"/>
<xs:attribute name="comment" type="xs:string" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
有了这个,我就能够执行规则1&amp; 2但是,第3条规则未被强制执行,因此以下条目有效:
<loc required="false" comment="Another comment"/>
我错过了什么?我已经花了几个小时就已经开始了!
答案 0 :(得分:2)
尝试这个 - 它可以工作
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="nonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:whiteSpace value="collapse" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="loc_type">
<xs:simpleContent>
<xs:extension base="nonEmptyString">
<xs:attribute name="required" type="xs:boolean" use="required"/>
<xs:attribute name="comment" type="nonEmptyString" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="locs">
<xs:complexType>
<xs:sequence>
<xs:element name="loc" type="loc_type" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 1 :(得分:1)
你非常接近。
您说第三个约束没有被强制执行,但您显示的示例并未说明非强制执行:元素
<loc required="false" comment="Another comment"/>
具有零长度字符串作为内容。您告诉XSD验证器,当您说loc的类型是xs:string的扩展名时,这没关系。
你需要采取的方法由JirkaŠ。答案说明。如果您对任何非空字符串感到满意,您可以逐字采用该解决方案。但在此之前,请确保您愿意接受这样的实例:
<loc required="false" comment="	 "> </loc>
如果你不是,那么你的要求不是那个注释,loc应该有字符串值,也不是它们应该有非空的字符串值,而是更严格的。当然,理想情况下,您希望它们具有有用的,合理的值,但可能无法正式定义有用的注释集或有用的loc值集。 。有些人会说他们想要一个非空字符串,而不是完全由空格和标点符号组成(所以它至少有一个字符与\w
类匹配)。
<xs:simpleType name="nonEmptyNonWSString">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:pattern value="(\W)*\w(\W|\w)*"/>
</xs:restriction>
</xs:simpleType>
答案 2 :(得分:0)
谢谢你的回答,希望我能接受他们两个!这是我最终采用的(也修改了删除混淆的问题):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Must be a string of non-zero length, not composed entirely of whitespace and punctuation marks -->
<xs:simpleType name="nonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:whiteSpace value="collapse"/>
<xs:pattern value="(\W)*\w(\W|\w)*"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="locs">
<xs:complexType>
<xs:sequence>
<xs:element name="loc" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="nonEmptyString">
<xs:attribute name="required" type="xs:boolean" use="required"/>
<xs:attribute name="comment" type="nonEmptyString" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>