大家
我有一个xsd架构(cft.xsd),它描述了一个非常通用的顶层结构:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cft="http://www.foo.com/xsd/cft" targetNamespace="http://www.foo.com/xsd/cft" elementFormDefault="qualified">
<xsd:complexType name="dirType">
<xsd:choice minOccurs="1" maxOccurs="unbounded">
<xsd:element name="dir" type="cft:dirType"/>
<xsd:element name="txt">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="Name" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z_]+\.txt"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="xml">
<xsd:complexType>
<xsd:sequence maxOccurs="1" minOccurs="1">
<xsd:any/>
</xsd:sequence>
<xsd:attribute name="Name" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z_]+\.xml"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
<xsd:element name="root" type="cft:dirType"/>
</xsd:schema>
第二个模式(dictionary.xsd),它将描述需要在&lt; cft:xml&gt;中的内容。节点:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:l="http://www.foo.com/xsd/dictionary" xmlns:cft="http://www.foo.com/xsd/cft" targetNamespace="http://www.foo.com/xsd/dictionary" elementFormDefault="qualified">
<xsd:element name="root">
<xsd:simpleType>
<xsd:attribute name="Version" type="xsd:string" use="required"/>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
这样文件会是这样的:
<cft:root xmlns:cft="http://www.foo.com/xsd/cft" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.com/xsd/cft cft.xsd">
<cft:xml Name="dictionary.xml">
<root xmlns="http://www.foo.com/xsd/dictionary" Version="17.0"/>
</cft:xml>
</cft:root>
我的问题是: 1.如何在dictionary.xsd中指定&lt; root&gt;在那里定义的元素只能嵌套在&lt; cft:xml&gt;中元件 - 那是&lt; cft:root&gt;的孩子元件 - 它的Name属性为“dictionary.xml” 2.我如何限制&lt; cft:xml&gt; cft.xsd中的元素具有唯一名为&lt; root&gt;的元素来自不同的命名空间而不是cft?
提前致谢!
答案 0 :(得分:1)
在此之前, dictionary.xsd 应如下所示(修复:complexType
而非simpleType
作为root
元素的类型)。
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:l="http://www.foo.com/xsd/dictionary" xmlns:cft="http://www.foo.com/xsd/cft" targetNamespace="http://www.foo.com/xsd/dictionary" elementFormDefault="qualified">
<xsd:element name="root">
<xsd:complexType>
<xsd:attribute name="Version" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
1:你做不到;没有办法控制一个XSD文件中的全局元素将如何在另一个XSD文件中使用。
2:你做不到;无法控制可以作为通配符匹配的元素的名称。只能使用namespace =“## other”属性约束xsd:any
- 但这就是你可以去的地方。
唯一可能为您提供所需功能的XSD 1.0替代方案是重新调整您的cft.xsd
,如下所示:
xml
全球注意:XSD不支持 xsd:redefine 代码绑定工具,因此您必须考虑使用XSD。
以下是修改后的 cft.xsd :
的示例<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cft="http://www.foo.com/xsd/cft" xmlns="http://www.foo.com/xsd/cft" targetNamespace="http://www.foo.com/xsd/cft" elementFormDefault="qualified">
<xsd:complexType name="dirType">
<xsd:choice minOccurs="1" maxOccurs="unbounded">
<xsd:element name="dir" type="cft:dirType"/>
<xsd:element name="txt">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="Name" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z_]+\.txt"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="xml" type="atype"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="atype">
<xsd:sequence>
<xsd:any/>
</xsd:sequence>
<xsd:attribute name="Name" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9a-zA-Z_]+\.xml"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
<xsd:element name="root" type="cft:dirType"/>
</xsd:schema>
然后,您可以使用 custom-cft.xsd 来验证您的XML:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://www.foo.com/xsd/cft" xmlns:dict="http://www.foo.com/xsd/dictionary" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.foo.com/xsd/cft" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:redefine schemaLocation="cft.xsd">
<xsd:complexType name="atype">
<xsd:complexContent>
<xsd:restriction base="atype">
<xsd:sequence>
<xsd:element ref="dict:root"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:redefine>
<xsd:import schemaLocation="dictionary.xsd" namespace="http://www.foo.com/xsd/dictionary"/>
</xsd:schema>
作为最后一条建议,我建议不要使用xml
之类的名称,因为根据XML 1.0 specification:名称以字符串“xml”开头,或者使用任何匹配的字符串(('X'|'x')('M'|'m')('L'|'l'))保留用于本规范的此版本或未来版本的标准化。我见过只拒绝使用xml
作为标记名称的XML文档的产品,因此出于互操作性原因,最好避免使用它。