如何限制包含的架构

时间:2013-03-28 21:20:10

标签: xsd xml-namespaces

大家

我有一个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?

提前致谢!

1 个答案:

答案 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 (重新定义cft.xsd),并在需要强制执行此规则的任何地方使用该文件。

注意: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文档的产品,因此出于互操作性原因,最好避免使用它。