如何为ID属性设置XSD限制

时间:2013-04-03 05:18:31

标签: android xml xsd

如果我想为:

定义XSD文件
<state id="1" name="S1">
<state id="2" name="S2">
<state id="3" name="S3">

<transition fromState="1" toState="2">

如何在XSD文件中限制属性fromStatetoState以仅获取state元素id上声明的值?

XSD定义似乎没有这样的功能,但是采用Android XML布局,Eclipse Android XML编辑器知道哪些ID放在内容辅助列表中。

1 个答案:

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

enter image description here

此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>

enter image description here

如果您查看图表,可以更轻松地查看选择器的工作方式。如果您决定使用此命令,并且您的XSD具有目标命名空间,并且您是否符合元素和/或属性,请确保为targetNamespace声明前缀并在XPath中使用该前缀。

通常,虽然知道如何使用此信息(key / keyref)来构建内容辅助列表以便于基于关联的XSD进行XML编辑,但工具并不多。通常具有特殊性质的编辑器会基于硬连线实现而不是仅仅从XSD推断出来。