我已经定义了一个名为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>
答案 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>
我无法完成这项工作,但是如果您想保留一个元素作为参考,这就是方法。