1

我正在尝试一段时间将 xsd 文件写入以下情况:

<Values xsi:type="me:ArrayOfValue">
   <Value xsi:type="xs:int">1</Value>
   <Value xsi:type="xs:string">I'm a string</Value>
   <Value xsi:type="me:Point">
      <X>10.2</X>
      <Y>2.3</y>
   </Value>
<Values/>

我这里有简单类型 (int, string) 和复杂 (point)的组合。

如果我只有我知道的简单类型,我可以轻松使用联合

所以我尝试了选择选项。

问题是,我不能对所有元素使用相同的名称(值)

有人可以帮我吗?

4

2 回答 2

1

为了更容易阅读,下面是一个稍微修改过的 XML(它不会改变答案的真实性,只是让它更容易阅读,因为我不必列出两个 XSD)。

<Values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <Value xsi:type="xs:int">1</Value>
   <Value xsi:type="xs:string">I'm a string</Value>
   <Value xsi:type="Point">
      <X>10.2</X>
      <Y>2.3</Y>
   </Value>
</Values>

此 XSD 将验证上述内容:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema xmlns:me="urn:tempuri-org" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Values">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="Value"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="Point" >
    <xsd:sequence minOccurs="0">
      <xsd:element name="X" type="xsd:decimal" />
      <xsd:element name="Y" type="xsd:decimal" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

问题是,即使您不想要日期,它也是使用 xsi:type="xs:date" 的值。但这只是 XSD 1.0 的一个限制。

要约束允许的 xsi:type 属性列表,您必须迁移到 XSD 1.1 或在 XSD 1.0 处理器之上使用 Schematron 约束。

于 2013-05-27T20:27:24.180 回答
0

如果您不介意为intand使用您的特定类型string,这里有一个可能的解决方案来验证以下正确的 XML 文件(您的格式有一些问题):

XML 文件

<me:Values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:me="me">
    <me:Value xsi:type="me:int">1</me:Value>
    <me:Value xsi:type="me:string">I'm a string</me:Value>
    <me:Value xsi:type="me:Point">
        <me:X>10.2</me:X>
        <me:Y>2.3</me:Y>
    </me:Value>
</me:Values>

验证它的 XML Schema

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="me" xmlns:me="me" elementFormDefault="qualified">
        <xs:element name="Values">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="me:Value" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="Value" type="me:myType"/>

        <xs:complexType abstract="true" name="myType" mixed="true"/>

        <xs:complexType name="Point" mixed="true">
            <xs:complexContent>
                <xs:extension base="me:myType">
                    <xs:sequence>
                        <xs:element name="X" type="xs:decimal"/>
                        <xs:element name="Y" type="xs:decimal"/>
                    </xs:sequence>                
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType name="string" mixed="true">
            <xs:simpleContent>
                <xs:restriction base="me:myType">
                    <xs:simpleType>
                        <xs:union memberTypes="xs:string"/>
                    </xs:simpleType>
                </xs:restriction>
            </xs:simpleContent>
        </xs:complexType>
        <xs:complexType name="int" mixed="true">
            <xs:simpleContent>
                <xs:restriction base="me:myType">
                    <xs:simpleType>
                        <xs:union memberTypes="xs:int"/>
                    </xs:simpleType>
                </xs:restriction>
            </xs:simpleContent>
        </xs:complexType>
    </xs:schema>

一些解释

它之所以有效,是因为我允许抽象类型的混合内容myType。这是(据我所知)将复杂类型限制为简单类型的唯一方法。缺点:你的Point类型是混合内容。

于 2013-05-27T20:49:36.747 回答