1

每个人

我有一个 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),它将描述需要在 <cft:xml> 节点中的内容:

<?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 中指定,在那里定义的 <root> 元素只能嵌套在 <cft:xml> 元素中 - 那是 <cft:root> 元素的子元素 -这有它的名称属性“dictionary.xml” 2. 如何限制 cft.xsd 中的 <cft:xml> 元素,使其唯一的元素名为 <root> 来自与 cft不同的命名空间?

提前致谢!

4

1 回答 1

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:你不能;无法控制可以作为通配符匹配的元素的名称。只能xsd:any使用 namespace="##other" 属性来限制你 - 但这是你能做到的。

唯一可以让您获得所需的 XSD 1.0 替代方案是重新调整您cft.xsd的如下:

  • 使您的xml全球类型
  • 在另一个 XSD 文件(重新定义 cft.xsd)中使用xsd:redefine并在需要强制执行此规则的任何地方使用该文件。

注意: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 规范的 since 名称:以字符串“xml”开头的名称,或任何匹配的字符串 (('X'|'x') ('M '|'m') ('L'|'l')),保留用于本规范的这个或未来版本的标准化。我见过一些产品简单地拒绝xml用作标记名称的 XML 文档,因此出于互操作性的原因,最好避免使用它。

于 2013-03-29T01:12:16.287 回答