扩展带有任何元素的XSD架构的问题

时间:2018-11-22 19:43:59

标签: xml xsd xml-validation

我有一个尝试验证以下XML的应用程序:

self.navigationController?.popToRootViewController(animated: true)

let viewController = self.storyboard?.instantiateViewController(withIdentifier: "Posts") as! PostsController

self.navigationController?.pushViewController(viewController, animated: true)

为了实现这一点,我有以下两个XSD模式:

contacts.xsd

<?xml version="1.0" encoding="UTF-8"?>
<cnt:agenda xmlns:cnt="urn:ppp:contacts"
    xmlns:cnt2="urn:ppp:contactsv2"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:ppp:contactsv2 contactsv2.xsd urn:ppp:contacts contacts.xsd ">
    <cnt:entry>
        <cnt:number>12345678</cnt:number>
    </cnt:entry>
    <cnt:entry>
        <cnt:number>12345678</cnt:number>
        <cnt2:personal-info>
           <cnt2:genre>male</cnt2:genre>
           <cnt2:age>30</cnt2:age>
        </cnt2:personal-info>
    </cnt:entry>
</cnt:agenda>

contactsv2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
   targetNamespace="urn:ppp:contacts"
   xmlns="urn:ppp:contacts"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="qualified" attributeFormDefault="unqualified">

  <xs:element name="agenda">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="entry" type="entry-type"/>
        <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="entry-type">
    <xs:sequence>
      <xs:element name="display-name" type="xs:string" minOccurs="0"/>
      <xs:element name="number" type="xs:string"/>
      <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
  </xs:complexType>
</xs:schema>

如您所见,第二个架构扩展了第一个架构,以向 entry 元素添加一些新的子元素。此时,我发现了一些问题:

  1. 如果扩展元素的键入错误(例如, gere 而不是 genre ),则验证程序不会给出任何错误。我知道这是因为松散作为所有 any 元素的processContents属性的值的原因,但是我不应该更改 contacts.xsd 架构。因此,我可以以某种方式绕过此行为吗?

  2. 我可以控制扩展元素在哪里添加吗?因为如果我将 personal-info 元素添加为议程的子元素,则验证程序会说该文档是有效的,并且我只希望将该元素显示为子元素。 entry

注意:我不能使用XSD 1.1版本

预先感谢

1 个答案:

答案 0 :(得分:0)

我不确定“否”是否可以作为答案,但是我认为这两个问题都不容易解决。您可以尝试使用xs:redefine修改给定的模式,而无需真正对其进行修改,但是我个人讨厌该功能,并且发现最好将提供的模式修改为源文档(也许通过使修改可重复,通过XSLT样式表)。