这是关于以下问题的后续问题:
How to set restriction on XSD for id attributes
我使用Eclipse。我用答案代码创建了一个XSD文件,我得到了这三个错误:
error: Error: No resource type specified (at 'xpath' with value '@id'). fsm.xsd /test/res/xml line 24 Android AAPT Problem
error: Error: No resource type specified (at 'xpath' with value '@toState'). fsm.xsd /test/res/xml line 32 Android AAPT Problem
error: Error: No resource type specified (at 'xpath' with value '@fromState'). fsm.xsd /test/res/xml line 28 Android AAPT Problem
使用xsd的XMLSchema-instance的XML测试文件验证OK,即使有3个提到的错误。
我想知道这些错误是否只是Eclipse中的一个小故障,还是我需要定义其他东西来摆脱它们。
XSD源代码:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="FSM">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="state">
<xs:complexType>
<xs:attribute name="id" type="xs:unsignedByte" use="required"/>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="transition">
<xs:complexType>
<xs:attribute name="fromState" type="xs:unsignedByte" use="required"/>
<xs:attribute name="toState" type="xs:unsignedByte" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="PKStates">
<xs:selector xpath="state"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref name="FKTransitionToStatesFrom" refer="PKStates">
<xs:selector xpath="transition"/>
<xs:field xpath="@fromState"/>
</xs:keyref>
<xs:keyref name="FKTransitionToStatesTo" refer="PKStates">
<xs:selector xpath="transition"/>
<xs:field xpath="@toState"/>
</xs:keyref>
</xs:element>
</xs:schema>
XML测试文件:
<?xml version="1.0" encoding="utf-8"?>
<FSM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fsm.xsd">
<state name="S1" id="1"/>
<state name="S2" id="2"/>
<state name="S3" id="3"/>
<transition toState="1" fromState="2"/>
</FSM>
答案 0 :(得分:1)
这是一个Eclipse问题,最有可能是您的设置。该模式在各种工具和平台中都非常有效,包括QTAssistant,Visual Studio,NetBeans,Xerces和Eclipse Helios(我知道,有点旧)。
答案 1 :(得分:0)
这是我发现适用于Eclipse的旁路
请注意,原始语法完全合法,但Eclipse XSD验证器似乎不接受它
xpath
属性中每个<xs:field>
的前缀 .// 似乎可以解决问题,在XML文件上使用此XSD架构进行的验证是正确执行的。更重要的是,Eclipse没有标记XSD文件错误,项目编译也成功进行。
<xs:key name="PKStates">
<xs:selector xpath="state"/>
<xs:field xpath=".//@id"/>
</xs:key>
<xs:keyref name="FKTransitionToStatesFrom" refer="PKStates">
<xs:selector xpath="transition"/>
<xs:field xpath=".//@fromState"/>
</xs:keyref>
<xs:keyref name="FKTransitionToStatesTo" refer="PKStates">
<xs:selector xpath="transition"/>
<xs:field xpath=".//@toState"/>
</xs:keyref>