2016-11-09 149 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