如果我想为:
定义XSD文件<state id="1" name="S1">
<state id="2" name="S2">
<state id="3" name="S3">
<transition fromState="1" toState="2">
如何在XSD文件中限制属性fromState
和toState
以仅获取state
元素id
上声明的值?
XSD定义似乎没有这样的功能,但是采用Android XML布局,Eclipse Android XML编辑器知道哪些ID放在内容辅助列表中。
答案 0 :(得分:2)
推荐的方法是使用unique / key / keyref结构。考虑这个修改过的XML(添加文档元素):
<Document>
<state id="1" name="S1"/>
<state id="2" name="S2"/>
<state id="3" name="S3"/>
<transition fromState="1" toState="2"/>
</Document>
此XSD完全符合您的要求:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Document">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="state">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:unsignedByte" use="required"/>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="transition">
<xsd:complexType>
<xsd:attribute name="fromState" type="xsd:unsignedByte" use="required"/>
<xsd:attribute name="toState" type="xsd:unsignedByte" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="PKStates">
<xsd:selector xpath="state"/>
<xsd:field xpath="@id"/>
</xsd:key>
<xsd:keyref name="FKTransitionToStatesFrom" refer="PKStates">
<xsd:selector xpath="transition"/>
<xsd:field xpath="@fromState"/>
</xsd:keyref>
<xsd:keyref name="FKTransitionToStatesTo" refer="PKStates">
<xsd:selector xpath="transition"/>
<xsd:field xpath="@toState"/>
</xsd:keyref>
</xsd:element>
</xsd:schema>
如果您查看图表,可以更轻松地查看选择器的工作方式。如果您决定使用此命令,并且您的XSD具有目标命名空间,并且您是否符合元素和/或属性,请确保为targetNamespace声明前缀并在XPath中使用该前缀。
通常,虽然知道如何使用此信息(key / keyref)来构建内容辅助列表以便于基于关联的XSD进行XML编辑,但工具并不多。通常具有特殊性质的编辑器会基于硬连线实现而不是仅仅从XSD推断出来。