将自定义类型定义为XML模式中的限制

时间:2013-07-15 08:02:03

标签: xml validation xsd

我要为源代码(多种语言)编写生成器。 应将类(即基本数据容器)指定为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和元素customTypevariable 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架构后执行此操作。

有人可以确认这是正确的吗?

1 个答案:

答案 0 :(得分:3)

是的,我认为你是对的。在xsd 1.0中,不可能进行动态限制,例如“if attribute name 等于XX,那么属性 type 只能等于ZZ”。在xsd 1.1中,有可能定义断言,但我不确定在可用的解析器中支持多少(可能Saxon可能具有此功能)。