1

如果我想为以下内容定义 XSD 文件:

<state id="1" name="S1">
<state id="2" name="S2">
<state id="3" name="S3">

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

如何在 XSD 文件中限制属性fromState并仅获取在元素toState上声明的值?stateid

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

4

1 回答 1

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 推断来执行此操作。

于 2013-04-03T13:13:31.323 回答