1

为了验证 XML 文档,我想知道是否可以对属性值进行引用。

我在 ID 属性中有带有数值的状态。在这些州,一个儿子在这里是为了过渡到另一个州。我想在这里放一个参考,以确保这个儿子中指定的 ID 是一个状态中的现有 ID。

主要目标是仅在文档中指定了所有 ID 时才验证文档。

有我的 XSD 文档:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.0">
    <xs:element name="scxml">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="state">
                    <xs:complexType>
                        <xs:choice maxOccurs="1">
                                <xs:element name="nextstate" type="xs:nonNegativeInteger"/>
                            </xs:sequence>
                        </xs:choice>
                        <xs:attribute name="id" use="required" type="xs:nonNegativeInteger"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="version" type="xs:string" use="optional"/>
        </xs:complexType>
        <xs:unique name="uniqueStateID">
            <xs:selector xpath="./state"/>
            <xs:field xpath="@id"/>
        </xs:unique>
    </xs:element>
</xs:schema>

所以我想 NEXTSTATE 节点的值是对节点状态 id 属性值的引用。

有效文档示例(两种状态,一种转换为现有 ID):

<sxml version="1.0">
    <state id="1">
        <nextstate>5</nextstate>
    </state>
    <state id="5" />
</scxml>

无效文档示例(两种状态,一种转换为不存在的 ID):

<sxml version="1.0">
    <state id="1">
        <nextstate>5</nextstate>
    </state>
</scxml>

你知道这是否可能吗?

感谢您的回答:)

4

1 回答 1

1

您可以验证 nextstate 属性是否引用了现有状态。代替<unique><key>与 结合使用<keyref>。此处示例:http ://www.w3.org/TR/xmlschema-0/#re​​port.xsd

但是,您无法使用 XML 模式验证每个状态都由 nextstate 属性引用,如果这是您希望通过“主要目标是仅在文档中指定了所有 ID 时才验证文档”实现的目标。

于 2011-09-07T12:17:08.890 回答