2016-11-09 89 views
0

我想创建一个带XSD的XML条件验证。我想如果元素Unit是“uri”,那么元素Value必须包含“http”,否则如果元素Unit是“date”,那么元素Value必须是一个时间戳,依此类推......我从一个简单的验证使用xs:assert并且不起作用。我已经测试了xs:assertion,但它产生了相同的错误。声明包含XSD

xmllint --noout --schema metadata.xsd metadata.xml 
metadata.xsd:46: element assert: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))). 
WXS schema metadata.xsd failed to compile 

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="metadata"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="AVU" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:sequence> 

     <xs:element name="Target" minOccurs="0"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="1088"/> 
     </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 

     <xs:element name="Attribute"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:minLength value="1"/> 
      <xs:maxLength value="2700"/> 
     </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 

     <xs:element name="Value"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="http://.*"/> 
      <xs:maxLength value="2700"/> 
     </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 

     <xs:element name="Unit"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="uri|string|integer|date|float"/> 
      <xs:maxLength value="250"/> 
     </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 

     </xs:sequence> 
     <xs:assert test="Unit = 'uri'" /> 
    </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 
+0

当心! ''只在XML Schema 1.1中可用。版本1.0中的模式(隐式)。还请检查xmllint是否能够处理XSD v1.1 .... – potame

回答

1

xs:assert和xs:assertion需要一个XSD 1.1处理器。但是您使用的是xml 1.0处理器的xmllint。

1

正如@potame和@MichaelKay已经说过的,您的错误是由于xs:assert与XSD 1.0处理器一起使用,当xs:assert需要XSD 1.1处理器时。

您有几种选择:

  1. 接受不那么严格的验证。
  2. 在XSD之外验证。
  3. 切换到XSD 1.1处理器。
  4. 重新设计您的XML。

关于#4,您的XML现在是高度抽象的。如果你想要更具体的元素命名,XSD 1.0可以为你做更多的类型检查。例如,当Unituri时,而不是Unit元素需要Value元素的特殊检查,那么可以简单地使用URI类型的元素xsd:anyURI。 (事实上​​,你可能会更具体和URI它是什么而不是其;例如:HomepagePaymentAPIEndpoint