Как реализовать полученный ответ (XSD)? - PullRequest
1 голос
/ 04 августа 2009

Я ищу лучшее решение для моей XML схемы (XSD).

У меня есть response:

<xs:element name="exampleCatalogResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="meta" type="tns:metaType" />
            <xs:element name="data" type="tns:defaultDataType" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

... the defaultDatatype:

<xs:complexType name="defaultDataType">
    <xs:sequence>
        <xs:element name="catalog">
            <xs:complexType>
                <xs:sequence maxOccurs="unbounded">
                    <xs:element name="catalogItem" type="tns:catalogItem" />
                </xs:sequence>
            </xs:complexType>
            <xs:unique name="itemIdConstraint">
                <xs:selector xpath="tns:catalogItem" />
                <xs:field xpath="tns:id" />
            </xs:unique>
        </xs:element>
    </xs:sequence>
</xs:complexType>

... и catalogItem:

<xs:complexType name="catalogItem">
    <xs:sequence>
        <xs:element name="id" type="xs:nonNegativeInteger" />
    </xs:sequence>
</xs:complexType>

... но теперь есть специальный предмет, который специализируется catalogItem:

<xs:complexType name="specialItem">
    <xs:complexContent>
        <xs:extension base="tns:catalogItem">
            <xs:sequence>
                <xs:element name="code" type="xs:string" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Теперь мне нужно специализированное Response для моего specialItem для ответа на запрос, который ожидает это specialItem.

Как я могу это понять, не написав другого defaultDataType, где только тип catalogItem меняется на tns:specialItem?

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Я не думаю, что в XSD вы можете применять ограничения совместного действия, подобные этому. В духе решения головоломки, вот неуклюжий способ сделать копии с желаемым изменением, без «написания другого defaultDataType» вручную:

  1. определяет вышеуказанные complexTypes в документе схемы без пространства имен.

  2. <include> это во втором документе схемы, который имеет пространство имен - это дает ему это пространство имен. Мы можем сделать это во многих документах схемы, каждый раз получая копию в этом отдельном пространстве имен.

  3. в каждом из этих документов схемы расширьте catalogItem, чтобы каждое расширение находилось в своем собственном пространстве имен.

  4. в окончательном документе схемы, включите все вышеперечисленное и сделайте их заменяемыми, чтобы они могли быть использованы в качестве ответа. (в качестве альтернативы вы могли бы заставить их расширять какой-либо другой элемент Response в схеме схема управления).

  5. ПРИМЕЧАНИЕ. Вам потребуется другой способ применения ограничения itemIdConstraint, который распространяется на пространства имен. Не знаю, возможно ли это.

Это работает путем создания отдельной копии defaultDataType для каждого, и поэтому не будет работать, если вы действительно хотите, чтобы они все использовали один и тот же defaultDataType. Как я уже сказал, это неловко, но это единственный способ, который я вижу, чтобы делать то, что вы хотите. Я предлагаю это как решение для загадки, а не как практическое решение!

0 голосов
/ 12 августа 2009

Спасибо за ваши чаевые 13рен,

Я использовал функцию Subsuration. Таким образом, catalogItem по умолчанию используется везде также для уникального выражения. И теперь, если я использую это в XML, я могу указать это через тип.

  <tns:catalogItem xsi:type="tns:specialItem">
    <tns:id>0</tns:id>
    <tns:code>tns:code</tns:code>
  </tns:catalogItem>
  <tns:catalogItem xsi:type="tns:specialItem">
    <tns:id>1</tns:id>
    <tns:code>tns:code</tns:code>
  </tns:catalogItem>
  <tns:catalogItem>
    <tns:id>2</tns:id>
    <tns:code>tns:code</tns:code>
  </tns:catalogItem>

Таким образом, последний элемент используется по умолчанию, а два приведенных выше являются специализированными. это работает очень хорошо для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...