我有一个尝试验证以下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 元素添加一些新的子元素。此时,我发现了一些问题:
如果扩展元素的键入错误(例如, gere 而不是 genre ),则验证程序不会给出任何错误。我知道这是因为松散作为所有 any 元素的processContents属性的值的原因,但是我不应该更改 contacts.xsd 架构。因此,我可以以某种方式绕过此行为吗?
我可以控制扩展元素在哪里添加吗?因为如果我将 personal-info 元素添加为议程的子元素,则验证程序会说该文档是有效的,并且我只希望将该元素显示为子元素。 entry 。
注意:我不能使用XSD 1.1版本
预先感谢
答案 0 :(得分:0)
我不确定“否”是否可以作为答案,但是我认为这两个问题都不容易解决。您可以尝试使用xs:redefine修改给定的模式,而无需真正对其进行修改,但是我个人讨厌该功能,并且发现最好将提供的模式修改为源文档(也许通过使修改可重复,通过XSLT样式表)。