"Unwrapped" XML 数据对 XSD 有效 "Wrapper"

"Unwrapped" XML data is valid against XSD of "Wrapper"

一组XSD可以定义一个复杂的树状结构

例如,表示这个示例模型:

LogicFileSample
 +--- Bulk A
         +---- Detail A1
         +---- Detail A2
 +--- Bulk B
         +---- Detail B1
         +---- Detail B2
         ...
 +--- ...   

LogicFileSampleBulk有一些额外的属性,Detail只是一个字符串。

您可以实施 2 个 XSD 架构:

1. LogicFileSample.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:bulk="urn:iso:std:iso:20022:tech:xsd:BulkSample"  
    xmlns:logFs="urn:LogicFileSample:xsd:$LogicFileSample.xsd"
    targetNamespace="urn:LogicFileSample:xsd:$LogicFileSample.xsd"
    elementFormDefault="qualified">
    <!-- IMPORT -->
    <xs:import namespace="urn:iso:std:iso:20022:tech:xsd:BulkSample" schemaLocation="BulkSample.xsd"/>

    <xs:element name="LogicFileSampleRoot">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SuperField01" type="logFs:Max5Text" minOccurs="1" maxOccurs="1"/>
                <xs:element name="SuperField02" type="logFs:Max5Text" minOccurs="1" maxOccurs="1"/>
                <!-- Bulks Container -->
                <xs:element name="BulksContainer" type="bulk:BulkSegmentType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="Max5Text">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9A-Z]{5,5}"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

2。 BulkSample.xsd

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema
    xmlns="urn:iso:std:iso:20022:tech:xsd:BulkSample"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="urn:iso:std:iso:20022:tech:xsd:BulkSample"
    elementFormDefault="qualified">
    <xs:element name="Document" type="DocumentType"/>
    <xs:complexType name="DocumentType">
        <xs:sequence>
            <xs:element name="BulksContainer" type="BulkSegmentType"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BulkSegmentType">
        <xs:sequence>
            <xs:element name="BulkHeader"    type="xs:string"/>
            <xs:element name="DetailElement" type="xs:string" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

现在,如果您创建一个 XML 文件,其中 n 块包裹在 LogicFileSample 中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<logFs:LogicFileSampleRoot 
    xmlns:logFs="urn:LogicFileSample:xsd:$LogicFileSample.xsd" 
    xmlns:bulk="urn:iso:std:iso:20022:tech:xsd:BulkSample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- LogicFileSample info fields -->
  <logFs:SuperField01>ABCDE</logFs:SuperField01>
  <logFs:SuperField02>12345</logFs:SuperField02>
  <!-- 3 BulksContainer -->
  <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_A</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_A1</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_A2</bulk:DetailElement>
  </logFs:BulksContainer>
    <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_B</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_B1</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_B2</bulk:DetailElement>
    <bulk:DetailElement>DetailElement_B3</bulk:DetailElement>
  </logFs:BulksContainer>
    <logFs:BulksContainer>
    <bulk:BulkHeader>BulkHeader_C</bulk:BulkHeader>
    <bulk:DetailElement>DetailElement_C1</bulk:DetailElement>
  </logFs:BulksContainer>
</logFs:LogicFileSampleRoot>

...您可以针对 "LogicFileSample.xsd" 进行验证并且它有效(不错)。

然后,您可以创建一个单独的 "bulk" XML 文件,展开。像这样:

<?xml version="1.0" encoding="UTF-8"?>
<blk:Document 
    xmlns:blk="urn:iso:std:iso:20022:tech:xsd:BulkSample"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <blk:BulksContainer>
    <blk:BulkHeader>BulkHeader_X</blk:BulkHeader>
    <blk:DetailElement>DetailElement_X1</blk:DetailElement>
    <blk:DetailElement>DetailElement_X2</blk:DetailElement>
  </blk:BulksContainer>
</blk:Document>

并且如果您根据 "BulkSample.xsd" 进行验证,则结果正常。

BUT。 . .

如果您获取 "unwrapped" XML 文件并尝试根据 "LogicFileSample.xsd" 进行验证,会发生什么情况?

嗯...它对 "LogicFileSample.xsd" 有效!

为什么?首先,根元素是 Document(而不是 LogicFileSampleRoot)并且强制性的 属性 元素 SuperField... 不存在!

请问有人能解释一下原因吗?

Why? First of all, root element is "Document" (instead of "LogicFileSampleRoot")

因为 XSD 中全局定义的任何元素都可以用作 XML 文档中的根元素。当您将另一个 XSD 导入基础 XSD 时,那里的全局定义元素将被允许用作根元素。

and the mandatory attributes "SuperField..." are not present!

强制组件(元素,在这种情况下,实际上,但属性也是如此)仅对于关联的父元素是必需的。因此,SuperField 仅对 LogicFileSampleRoot 是必需的,而不是一般的文档,无论父元素如何。