基于用法的XML Schema元素限制

时间:2019-07-13 20:11:19

标签: xml xsd xsd-validation

我已经定义了一个名为transform

的元素
<xs:element name="transformName" type="xs:string"/>

我想在其他各种元素中使用该元素。例如

<xs:element name="input">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="transformName"/>
            <xs:element name="description" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="output">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="transformName"/>
            <xs:element name="description" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我知道我可以使用类似的东西来限制可以在转换名称中输入的内容

<xs:element name="transformName">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="transform\.\S+\.\S+\.\d{1}\.v\d+"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

但是有什么方法可以改变每个父元素的限制吗?

例如,在输入中使用时可能是:

<xs:restriction base="xs:string">
    <xs:pattern value="inputTransform\.\S+\.\d{1}"/>
</xs:restriction>

但是在输出中使用时可能是:

<xs:restriction base="xs:string">
    <xs:pattern value="outputTransform\.\S+\.\d{1}"/>
</xs:restriction>

1 个答案:

答案 0 :(得分:1)

由于您说您仅限使用XSD-1.0,因此避免使用xs:alternative。通过

  

“为每个可能性/父元素定义类型。”

我的意思是为每个type创建一个xs:pattern
因此,对于这样的示例XML:

<root>
    <input>
        <transformName>inputTransform.A.1</transformName>
        <description />
    </input>
    <output>
        <transformName>outputTransform.C.2</transformName>
        <description />
    </output>
</root>

...验证它的XSD-1.0代码如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="input">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="transformName" type="tnInput" />
                            <xs:element name="description" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="output">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="transformName" type="tnOutput" />
                            <xs:element name="description" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="tnInput">
        <xs:restriction base="xs:string">
            <xs:pattern value="inputTransform\.\S+\.\d{1}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tnOutput">
        <xs:restriction base="xs:string">
            <xs:pattern value="outputTransform\.\S+\.\d{1}"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

看到它为每个父元素(simpleType / xs:pattern)定义了一个不同的input和一个不同的output


为避免这种情况,您必须使用XSD-1.1 xs:alternative方法,如下所示:

<xs:element name="transformName" type="xs:string">
    <xs:alternative test="ancestor::input"  type="inputType"/>
    <xs:alternative test="ancestor::output" type="outputType"/>
</xs:element>

我无法完成这项工作,但是如果您想保留一个元素作为参考,这就是方法。