2016-11-09 9 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スキーマ1.1でのみ利用可能です。バージョン1.0のあなたのスキーマ(暗黙的に)。 xmllintがXSD v1.1を処理できることを確認してください.... – potame

答えて

1

xs:assertとxs:assertionにはXSD 1.1プロセッサが必要です。しかし、あなたはXSD 1.0プロセッサであるxmllintを使用しています。

1

@potameと@MichaelKayが既に言ったように、xs:assertにXSD 1.1プロセッサが必要な場合、xs:assertをXSD 1.0プロセッサで使用しているためにエラーが発生しています。

あなたは、いくつかのオプションがあります。

  1. あまり厳しく検証を受け入れるを。
  2. XSDの外部で検証します。
  3. XSD 1.1プロセッサに切り替えます。
  4. XMLを再デザインします。

#4に関して、あなたのXMLは非常に抽象度が高いです。より具体的な要素の命名に移行する場合、XSD 1.0はより多くの型チェックを行うことができます。たとえば、Unit要素の代わりにValue要素の特別なチェックが必要な場合はUnituriの場合はxsd:anyURIURI要素を持つことができます。 (実際には、あなたも、より具体的で、それはではなく、そのタイプ何のためにあるのかため名前URIかもしれません。例えば:HomepageまたはPaymentAPIEndpoint。)

関連する問題