根据子元素属性验证XML元素属性值
我有以下XML格式:根据子元素属性验证XML元素属性值,xml,xsd,xsd-validation,xsd-1.0,Xml,Xsd,Xsd Validation,Xsd 1.0,我有以下XML格式: <generator Mode="High"> <GenMode name="Normal" kV="90" mA="0.5" /> <GenMode name="High" kV="160" mA="0.7" /> </generator> 我认为在XSD 1.0中,如果不创建具有不同名称的元素,最接近的方法是定义generator/@Mode应该引用第一个GenMode/@name: <xs:ele
<generator Mode="High">
<GenMode name="Normal" kV="90" mA="0.5" />
<GenMode name="High" kV="160" mA="0.7" />
</generator>
我认为在XSD 1.0中,如果不创建具有不同名称的元素,最接近的方法是定义
generator/@Mode
应该引用第一个GenMode/@name
:
<xs:element name="generator">
<xs:complexType>
<xs:sequence>
<xs:element name="GenMode" type="GenModeType">
<!-- This is the key of the first GenMode -->
<xs:key name="firstGenModeKey">
<xs:selector xpath="."/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:element name="GenMode" minOccurs="0" maxOccurs="unbounded" type="GenModeType" />
</xs:sequence>
<xs:attribute name="Mode" use="required" type="xs:string"/>
</xs:complexType>
<!-- Mode attribute should refer to firstGenModeKey -->
<xs:keyref refer="firstGenModeKey" name="ign">
<xs:selector xpath="."/>
<xs:field xpath="@Mode"/>
</xs:keyref>
<!-- Every genMode/@name should be unique, so you can use xs:unique also -->
<xs:key name="GenModeName">
<xs:selector xpath="GenMode"/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:complexType name="GenModeType">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="kV" use="required" type="xs:integer"/>
<xs:attribute name="mA" use="required" type="xs:decimal"/>
</xs:complexType>
如您所知,如果使用XSD 1.1,您只需要添加一个断言,如下面的示例所示:
<xs:assert test="count(GenMode[@name = ../@Mode]) = 1"/>
我找到了用XSD 1.0验证属性值的方法,它不应该只引用第一个子元素
<xs:element name="generator">
<xs:complexType>
<xs:sequence>
<xs:element name="GenMode" maxOccurs="unbounded" type="GenModeType"/>
</xs:sequence>
<xs:attribute name="Mode" use="required" type="xs:string"/>
</xs:complexType>
<xs:unique name="GenModeNameUniquenessCheck">
<!-- check for uniqueness @name attribute of all GenMode elements -->
<xs:selector xpath="GenMode"/>
<xs:field xpath="@name"/>
</xs:unique>
<xs:keyref name="GeneratorModeValid" refer="GenModeNameUniquenessCheck">
<!-- check generator/@Mode is one of generator/GenMode/@name -->
<xs:selector xpath="."/>
<xs:field xpath="@Mode"/>
</xs:keyref>
</xs:element>
<xs:complexType name="GenModeType">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="kV" use="required" type="xs:integer"/>
<xs:attribute name="mA" use="required" type="xs:decimal"/>
</xs:complexType>
你说的是什么意思?我想检查一下?如果XML有一个与generator/@模式同名的GenMode,那么它应该是有效的还是无效的?如果您希望一个GenMode必须始终与generator/@mode具有相同的名称,那么您可能只能使用XSD 1。1@sergioFCgenerator/@mode
应仅在其中一个GenMode
具有相同名称时有效。您需要使用XSD 1.1。在XSD1.0中,我能想到的最好方法是将generator/@mode-type定义为xs:ID,并在序列的末尾添加一个新元素GenMode,GenMode/@mode-type为xs:IDREF。
<xs:element name="generator">
<xs:complexType>
<xs:sequence>
<xs:element name="GenMode" maxOccurs="unbounded" type="GenModeType"/>
</xs:sequence>
<xs:attribute name="Mode" use="required" type="xs:string"/>
</xs:complexType>
<xs:unique name="GenModeNameUniquenessCheck">
<!-- check for uniqueness @name attribute of all GenMode elements -->
<xs:selector xpath="GenMode"/>
<xs:field xpath="@name"/>
</xs:unique>
<xs:keyref name="GeneratorModeValid" refer="GenModeNameUniquenessCheck">
<!-- check generator/@Mode is one of generator/GenMode/@name -->
<xs:selector xpath="."/>
<xs:field xpath="@Mode"/>
</xs:keyref>
</xs:element>
<xs:complexType name="GenModeType">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="kV" use="required" type="xs:integer"/>
<xs:attribute name="mA" use="required" type="xs:decimal"/>
</xs:complexType>