Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据子元素属性验证XML元素属性值_Xml_Xsd_Xsd Validation_Xsd 1.0 - Fatal编程技术网

根据子元素属性验证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

我有以下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: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@sergioFC
generator/@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>