XML验证不需要';t根据另一个属性验证一个属性
我浏览了许多站点,然后创建了Xml模式,其中其他属性取决于其中一个属性的值 以下xml文件: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 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。