参考ID

时间:2011-09-07 10:46:49

标签: xml xsd xsd-validation

为了验证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节点的值是对节点STATE中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>

你知道是否可能吗?

感谢您的回答:)

1 个答案:

答案 0 :(得分:1)

您可以验证nextstate属性是否指向现有状态。将<unique><key>结合使用,而不是<keyref>。示例:http://www.w3.org/TR/xmlschema-0/#report.xsd

但是,您无法使用XML架构验证每个状态是否由nextstate属性引用,如果这是您想要实现的目标“主要目标是仅在文档中指定了所有ID时验证文档”