为了验证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>
你知道是否可能吗?
感谢您的回答:)
答案 0 :(得分:1)
您可以验证nextstate属性是否指向现有状态。将<unique>
与<key>
结合使用,而不是<keyref>
。示例:http://www.w3.org/TR/xmlschema-0/#report.xsd
但是,您无法使用XML架构验证每个状态是否由nextstate属性引用,如果这是您想要实现的目标“主要目标是仅在文档中指定了所有ID时验证文档”