Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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验证不需要';t根据另一个属性验证一个属性_Xml_Xsd - Fatal编程技术网

XML验证不需要';t根据另一个属性验证一个属性

XML验证不需要';t根据另一个属性验证一个属性,xml,xsd,Xml,Xsd,我浏览了许多站点,然后创建了Xml模式,其中其他属性取决于其中一个属性的值 以下xml文件: <?xml version="1.0"?> <Main> <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/> <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/>

我浏览了许多站点,然后创建了Xml模式,其中其他属性取决于其中一个属性的值

以下xml文件:

<?xml version="1.0"?>
<Main>
  <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/>
  <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/>
  <Matter kind="country" continent="Asia" name="japan"/>
</Main>

种类属性可以有水果、汽车和国家。根据属性,还需要其他参数,如国家值,需要大陆属性

下面是XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Main">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Matter"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Matter">
    <xs:complexType>
      <xs:attribute name="name" use="required" type="xs:NCName"/>
      <xs:alt cond="@kind='fruits'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="fruits"/>
      <xs:attribute name="color" type="xs:NCName"/>
      <xs:attribute name="quantity" type="xs:integer"/>
      </xs:alt>
      <xs:alt cond="@kind='car'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="car"/>
      <xs:attribute name="brand" type="xs:NCName"/>
      <xs:attribute name="quantity" type="xs:integer"/>
      <xs:attribute name="color" type="xs:NCName"/>
      </xs:alt>
      <xs:alt cond="@kind='country'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="country"/>
      <xs:attribute name="continent" type="xs:NCName" use="required"/>
      </xs:alt>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我用上面的XSD验证XML文件时,我得到了一个错误,即“元素alt无效、错位或发生得太频繁


请帮助我使用正确的XSD验证上述文件。

我不知道您是从哪里了解xsl:alt的。也许是XML模式的专有扩展


XSD 1.1标准有一个称为条件类型分配的功能,有点像这样,有一个称为xs:alternative的元素。Xerces和Saxon的最新版本支持XSD 1.1。

我不知道xsl:alt的概念是从哪里来的。也许是XML模式的一些专有扩展


XSD 1.1标准有一个称为条件类型分配的功能,有点像这样,有一个称为xs:alternative的元素。Xerces和Saxon的最新版本支持XSD 1.1。

我想您应该使用
xs:extension
,如下所示。 下面是一个示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<Main xmlns="http://www.example.com/matters">
    <Fruit calories="10" name="apple" quantity="10" color="red"/>
    <Car brand="ford" name="ikon" quantity="1" color="red"/>
    <Car brand="dodge" name="fire" quantity="1" color="blue"/>
    <Country continent="Asia" name="Japan"/>
    <Country continent="Europe" name="Italy"/>
</Main>

这是这个XML的XSD。唯一的限制是相同类型的元素应该按顺序分组。 您还可以添加固定属性,但由于标记的名称指示类型,因此我认为它们不是必需的

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <!-- document structure -->
    <xs:element name="Main">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- types definitions -->
    <xs:complexType name="matterType">
        <xs:attribute name="name" use="required" type="xs:NCName"/>
    </xs:complexType>
    <xs:complexType name="fruitType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="color" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="calories" type="xs:integer"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="carType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="brand" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="color" type="xs:NCName"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="countryType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="continent" type="xs:NCName" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

我想您应该使用以下
xs:extension
。 下面是一个示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<Main xmlns="http://www.example.com/matters">
    <Fruit calories="10" name="apple" quantity="10" color="red"/>
    <Car brand="ford" name="ikon" quantity="1" color="red"/>
    <Car brand="dodge" name="fire" quantity="1" color="blue"/>
    <Country continent="Asia" name="Japan"/>
    <Country continent="Europe" name="Italy"/>
</Main>

这是这个XML的XSD。唯一的限制是相同类型的元素应该按顺序分组。 您还可以添加固定属性,但由于标记的名称指示类型,因此我认为它们不是必需的

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <!-- document structure -->
    <xs:element name="Main">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- types definitions -->
    <xs:complexType name="matterType">
        <xs:attribute name="name" use="required" type="xs:NCName"/>
    </xs:complexType>
    <xs:complexType name="fruitType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="color" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="calories" type="xs:integer"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="carType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="brand" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="color" type="xs:NCName"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="countryType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="continent" type="xs:NCName" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

看起来您正试图从另一种类型中创建一种类型。我认为您应该重构并使用它们自己的规则创建新类型。然后您可以在一次过程中继续使用原始修改的xsd和解析

<?xml version="1.0"?>
<Main>
    <fruits calories="10" name="apple" quantity="10" color="red"/>
    <car brand="ford" name="ikon" quantity="1" color="red"/>
    <country continent="Asia" name="japan"/>
</Main>

看起来您正试图从另一种类型中创建一种类型。我认为您应该重构并使用它们自己的规则创建新类型。然后您可以在一次过程中继续使用原始修改的xsd和解析

<?xml version="1.0"?>
<Main>
    <fruits calories="10" name="apple" quantity="10" color="red"/>
    <car brand="ford" name="ikon" quantity="1" color="red"/>
    <country continent="Asia" name="japan"/>
</Main>


xs:alt不是有效的Xsd构造。Xsd不会根据文档内容进行验证,它只允许验证“形状”“。我认为xs:alt可能是模式的扩展,如果是这种情况,您需要使用了解如何处理它的验证器。开箱即用的文档不是有效的架构,因为它使用的构造(关键字)未在XSD中定义。xs:alt不是有效的XSD构造。Xsd不会根据文档的内容进行验证,它只允许验证“形状”。我认为xs:alt可能是模式的扩展,如果是这种情况,您需要使用一个了解如何处理它的验证器。开箱即用的文档不是有效的架构,因为它使用的构造(关键字)未在XSD中定义。我认为,属性条件检查无法通过XSD实现,GET指针指向DSD。有很多可用的验证技术。DSD是我从未遇到过的。如果您不致力于XSD路由,那么首先要看的是RELAXNG。我认为,属性条件检查不能通过XSD实现,GET指针指向DSD。有很多可用的验证技术。DSD是我从未遇到过的。如果您不致力于XSD路由,那么首先要看的是RELAXNG。