我有这个简单的XML文件:
<TestBuilder>
<TestBox testValue="x">test1,test2,test2</TestBox>
<Test id="test1" />
<Test2 id="test2" />
<SomethingElse id="test3" />
</TestBuilder>
我想为TestBox
编写一个XSD验证,以验证所有值(由,
拆分)是否引用XML文件中的其他元素ID。
我只能验证TestBox
值是否为空,但我不知道如何按,
分割值并检查引用。
<xs:simpleType name="TestBoxType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="TestBoxTagType">
<xs:simpleContent>
<xs:extension base="TestBoxType">
<xs:attribute name="testValue" type="xs:string" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
你知道是否有可能吗?如何用通用解决方案解决?
答案 0 :(得分:3)
XML Schema支持列表,但只是空格分隔,而不是逗号分隔(另请注意,由于TestBox的结束标记中缺少/
,文档格式不正确)。也就是说,如果您可以预处理文档以使用空格而不是逗号,那么您所要求的应该是可能的:
<TestBuilder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<TestBox testValue="x">test1 test2 test2</TestBox>
<Test id="test1" />
<Test2 id="test2" />
<SomethingElse id="test3" />
</TestBuilder>
上述文档对以下模式有效,您可以在其中看到TestBoxTagType类型扩展xs:IDREFS
,这是IDREF
的列表。同样,所有id
属性都被定义为具有xs:ID
类型,以便ID机制起作用。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="TestBuilder">
<xs:complexType>
<xs:sequence>
<xs:element name="TestBox" type="TestBoxTagType"/>
<xs:element name="Test" type="withIDType"/>
<xs:element name="Test2" type="withIDType"/>
<xs:element name="SomethingElse" type="withIDType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TestBoxTagType">
<xs:simpleContent>
<xs:extension base="xs:IDREFS">
<xs:attribute name="testValue" type="xs:string" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="withIDType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:ID" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>