为什么不是xsd:任何验证都按预期工作?

时间:2016-03-18 08:23:59

标签: xml xsd xsd-validation xml-validation

我想通过架构验证以下XML,如果l10n元素中没有文本,则不应验证它。此外,元素对于XML也是必需的。请有人建议我相关的答案。

要验证的XML将是:

<body xmlns="http://iddn.icis.com/ns/test">
   <content>
      <l10n xml:lang="en"></l10n>
   </content>
</body>

我目前使用的架构如下,但它仍然允许验证上述XML。

<xs:schema elementFormDefault="qualified" targetNamespace="http://iddn.icis.com/ns/test" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:conf="http://iddn.icis.com/ns/config" 
xmlns="http://www.w3.org/1999/xhtml">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">
</xs:import>
<xs:simpleType name="nameType">  
    <xs:restriction base="xs:string">  
        <xs:minLength value="1"/>   
    </xs:restriction>  
</xs:simpleType>

<xs:element name="content">
      <xs:complexType mixed="true">
         <xs:sequence>
            <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>

<xs:complexType name="i18n-value">
      <xs:sequence>
         <xs:element name="l10n" maxOccurs="unbounded">
            <xs:complexType>
               <xs:simpleContent>
                  <xs:extension base="nameType">
                     <xs:attribute ref="xml:lang" use="required"/>
                  </xs:extension>
               </xs:simpleContent>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>

<xs:element name="body">
  <xs:complexType>
    <xs:sequence><xs:element ref="content"></xs:element></xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:1)

这里有很多问题。让我们分两个阶段集体解决它们:首先,我们将修复阻止进行任何类型验证的XSD问题。

修复初始XSD问题

此XML

<?xml version="1.0" encoding="utf-16"?>
<body xmlns="http://iddn.icis.com/ns/test"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://iddn.icis.com/ns/test try.xsd">
  <content>
    <l10n xml:lang="en"></l10n>
  </content>
</body>

对此XSD有效:

<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://iddn.icis.com/ns/test"
           xmlns:tst="http://iddn.icis.com/ns/test">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"
             schemaLocation="http://www.w3.org/2001/xml.xsd"/>

  <xs:simpleType name="nameType">  
    <xs:restriction base="xs:string">  
      <xs:minLength value="1"/>
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="content">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="i18n-value">
    <xs:sequence>
      <xs:element name="l10n" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="tst:nameType">
              <xs:attribute ref="xml:lang" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="body">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tst:content"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

现在,l10n不为空的约束仍有待解决。以下是如何执行此操作:

  • xsd:any/@processContentsskip更改为lax以便您 可以通过元素声明影响xsd:any下的验证。点击此处了解有关差异的更多信息:processContents strict vs lax vs skip for xsd:any

  • 实际为xs:element定义i18n-value;有类型 单凭定义是不够的。

  • i18n-value添加到您的XML。

...共

最终XSD和XML

<强> XML

<?xml version="1.0" encoding="utf-16"?>
<body xmlns="http://iddn.icis.com/ns/test"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://iddn.icis.com/ns/test try.xsd">
  <content>
    <i18n-value>
      <l10n xml:lang="en"></l10n>
    </i18n-value>
  </content>
</body>

<强> XSD

<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://iddn.icis.com/ns/test"
           xmlns:tst="http://iddn.icis.com/ns/test">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"
             schemaLocation="http://www.w3.org/2001/xml.xsd"/>

  <xs:simpleType name="nameType">
    <xs:restriction base="xs:string">  
      <xs:minLength value="1"/>
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="content">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="i18n-value">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="l10n" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="tst:nameType">
                <xs:attribute ref="xml:lang" use="required"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="body">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tst:content"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>