XSD - 验证该元素是否指向XML文件中的其他元素

时间:2017-01-03 10:14:45

标签: java xml xsd

我有这个简单的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>

你知道是否有可能吗?如何用通用解决方案解决?

1 个答案:

答案 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>