我要为源代码(多种语言)编写生成器。 应将类(即基本数据容器)指定为XML 文件。为了自动验证和解析这些XML文件,我是 定义XSD架构。这应该是一个有效的文件:
<?xml version="1.0"?>
<class>
<customType name="vector3D">
<variable name="x" type="int"/>
<variable name="y" type="int"/>
<variable name="z" type="int"/>
</customType>
<variable name="identifier" type="string"/>
<variable name="direction" type="vector3D"/>
</class>
我定义了我的根元素class
和元素customType
和
variable
as:
<xsd:complexType name="Class">
<xsd:sequence>
<xsd:element name="customType" type="CustomType"
minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="variable" type="Variable"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:complexType>
<xsd:complexType name="CustomType">
<xsd:sequence>
<xsd:element name="variable" type="Variable"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string"
use="required"/>
</xsd:complexType>
<xsd:complexType name="Variable">
<xsd:attribute name="name" type="xsd:string"
use="required"/>
<xsd:attribute name="type" type="ValidType"
use="required"/>
</xsd:complexType>
然而,我正在努力尝试允许有限的一组
基本类型和 customType
标记中定义的名称。定义
我的基本类型很简单:
<xsd:simpleType name="ValidType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="bool"/>
<xsd:enumeration value="int"/>
<xsd:enumeration value="string"/>
</xsd:restriction>
</xsd:simpleType>
但是我有什么方法可以允许name
中定义的标识符
customType
标签的属性,或者我是否必须允许任何标签
xsd:string
并检查我的发电机内的有效性?
修改
如果我正确理解3.16.2 of the W3C XML Schema Definition Language (XSD) Recommendation,我想要的东西不能用XSD完成(因为限制仅限于
minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern | assertion | explicitTimezone
,它不支持这种动态限制),我必须在手动验证XSD架构后执行此操作。
有人可以确认这是正确的吗?
答案 0 :(得分:3)
是的,我认为你是对的。在xsd 1.0中,不可能进行动态限制,例如“if attribute name 等于XX,那么属性 type 只能等于ZZ”。在xsd 1.1中,有可能定义断言,但我不确定在可用的解析器中支持多少(可能Saxon可能具有此功能)。