【问题标题】:XML Schema for Tagged Union标记联合的 XML 模式
【发布时间】:2017-06-04 16:03:03
【问题描述】:

我有一个 XML 文档,其中包含一系列重复的地址,其实际内容取决于包含的枚举的值。我想这是一种“标记工会”[或“歧视工会”?]:

{
<AddressList>
    <Address>
        <AddressType type="addressEnum" fixed="CanadianAddress"/>
        <AddressValue>
            <Street type="textstring">123 Yonge Street</Street>
            <Province type="provinceEnum" value="Ontario"/>
            <PostalCode type="postalCodeType" value="M1N 2O3"/>
        </AddressValue>
    </Address>
    <Address>
        <AddressType type="addressEnum" fixed="USAddress"/>
        <AddressValue>
            <Street type="textstring">456 Front Street</Street>
            <State type="stateEnum" value="New York"/>
            <ZipCode type="zipCodeType" value="12345"/>
        </AddressValue>
    </Address>
</AddressList>
}

我不清楚如何表达 XML 模式 [即XSD] 用于上述 XML。我是否需要一个空的“AddressType”,“CanadianAddressType”和“USAddressType”都可以扩展?如果我有 50 个地址类型,我需要 50 个这样的扩展吗?

注意:如果不明显,USAddress 的元素不能出现在 CanadianAddress 枚举之后。同样,CanadianAddress 的元素不能出现在 USAdaddress 枚举之后。

【问题讨论】:

    标签: xml xsd discriminated-union


    【解决方案1】:

    这可以通过使用 XSD 1.1 的alternative 组件来实现。然后你就可以为&lt;AddressValue&gt;节点应用类型了,这取决于AddressType元素的fixed属性值,所以

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
        elementFormDefault="qualified"
        xmlns="http://tempuri.org/XMLSchema.xsd"
        xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
        vc:minVersion="1.1">
      <xs:element name="AddressList" >
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Address" minOccurs="1" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence minOccurs="1" maxOccurs="1">
                  <xs:element name="AddressType" type="AddressTypeTag"/>
                  <xs:element name="AddressValue" type="USAddressValue">
                    <xs:alternative test="../AddressType/@fixed='CanadianAddress'" type="CanadianAddressValue"/>
                    <xs:alternative test="../AddressType/@fixed='USAddress'" type="USAddressValue"/>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:complexType name="CanadianAddressValue">
        <xs:sequence minOccurs="1" maxOccurs="1">
          <xs:element name="Street" type="StreetValue"/>
          <xs:element name="Province" type="TypeAndValue"/>
          <xs:element name="PostalCode" type="TypeAndValue"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="USAddressValue">
        <xs:sequence minOccurs="1" maxOccurs="1">
          <xs:element name="Street" type="StreetValue"/>
          <xs:element name="State" type="TypeAndValue"/>
          <xs:element name="ZipCode" type="TypeAndValue"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="StreetValue">
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute name="type" type="xs:string"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
      <xs:complexType name="TypeAndValue">
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="value" type="xs:string"/>
      </xs:complexType>
      <xs:complexType name="AddressTypeTag">
        <xs:attribute name="type" fixed="addressEnum" type="xs:string" />
        <xs:attribute name="fixed" >
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="CanadianAddress"></xs:enumeration>
              <xs:enumeration value="USAddress"></xs:enumeration>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:complexType>
    </xs:schema>
    

    【讨论】:

    • 我并不热衷于拥有 XML 1.1 依赖项; (几乎)没有人使用它,而且很少有实现。特别是,我想使用不支持 XML 1.1 的 libxml2。但是,尽管有 XML 1.1,但我看不到上述模式如何在“USAddress”枚举和“USAddressValue”之间创建强制关联。
    • @badfd,我不知道这怎么可能,但我只发布了架构的最后一部分。明天我将尝试找到完整的架构。在 XSD 1.0 中,具有相同名称的元素必须属于相同的明确定义类型(请参阅the similar topic)。
    • @badfd,我已经更新了我的答案。现在架构已完全显示。我之前的评论描述了使用 XSD 1.1 的原因。祝你好运!
    • 我无法使用 Xerces-J,Alexander 复制您的结果。您使用的是什么验证工具?
    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 2017-05-15
    • 2015-03-02
    • 2014-06-26
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多