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>

<cft:xml> ノードに必要なコンテンツを記述する 2 つ目のスキーマ (dictionary.xsd):

<?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> 要素の子です - Name属性は "dictionary.xml"です。

前もって感謝します!

4

1 に答える 1

1

まず、dictionary.xsdは次のようになります (修正:要素の型としてではcomplexTypeなく)。simpleTyperoot

<?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:anynamespace="##other" 属性を使用して制約することしかできませんが、それは可能な限りです。

あなたが望むものを得るかもしれない唯一のXSD 1.0の代替手段はcft.xsd、次のように再調整することです:

  • xmlあなたのグローバルのタイプを作る
  • xsd: redefine を別の XSD ファイル (cft.xsd を再定義) で使用し、このルールを適用する必要がある場合は常にそのファイルを使用してください。

注: xsd:redefineは、XSD からコードへのバインディング ツールではサポートされていないため、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 1.0 仕様xmlに従って次のような名前を使用しないことをお勧めします。文字列 "xml" で始まる名前、または (('X'|'x') ('M '|'m') ('L'|'l')) は、この仕様のこのバージョンまたは将来のバージョンでの標準化のために予約されています。をタグ名として使用する XML ドキュメントを単純に拒否する製品を見たことがあるので、相互運用性の理由から、これは避けたほうがよいでしょう。xml

于 2013-03-29T01:12:16.287 に答える