Как избежать использования элементов XML, на которые нет ссылок (в том же документе XML) с помощью XSD - PullRequest
0 голосов
/ 21 мая 2019

Существует XML-документ, который определяет порядок оплаты карточками. Этот XML включает в себя список карточек и список бумажных носителей.

Каждой карточке должен быть назначен 1 бумажный носитель (это определяется вложенным XML-элементом карточки, называемым paper_carrier_id). Одному и тому же бумажному носителю можно назначить несколько карточек Не должно быть никаких бумажных носителей, которые не привязаны ни к одной карте.

Я могу сделать ключ / ключ в XSD для назначения 1 бумажного носителя каждой карточке. Но я не могу избежать ненужных XML-элементов paper_carrier. Можно ли вообще обойтись с XSD?

Вот мой XSD и XML:

<!-- XSD: https://pastebin.com/uDgmZyfU  -->
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- ROOT element -->
  <xs:element name='card_order_request' >
    <xs:complexType>
      <xs:sequence>
        <xs:element name='order_id' type='xs:string' />
        <xs:element name='card' type='CardOrderType' maxOccurs='unbounded' />
        <xs:element name='paper_carrier' type='PaperCarrierType' maxOccurs='unbounded' />
      </xs:sequence>
    </xs:complexType>

    <!-- KEY REFERENCES -->
    <xs:key name='PaperCarrierIdKey'>
      <xs:selector xpath='paper_carrier' />
      <xs:field xpath='@paper_carrier_id' />
    </xs:key>
    <xs:keyref name='PaperCarrierIdRefKey' refer='PaperCarrierIdKey'>
      <xs:selector xpath='card/paper_carrier_id' />
      <xs:field xpath='paper_carrier_id' />
    </xs:keyref>
    <!-- /KEY REFERENCES -->

  </xs:element>
  <!-- /ROOT element -->

  <xs:complexType name='CardOrderType'>
    <xs:sequence>
      <xs:element name='card_id' type='xs:long' />
      <xs:element name='paper_carrier_id' type='xs:unsignedInt' />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name='PaperCarrierType'>
    <xs:sequence>
      <xs:element name='paper_carrier_row1' type='xs:string' />
    </xs:sequence>
    <xs:attribute name='paper_carrier_id' type='xs:unsignedInt' use="required" />
  </xs:complexType>
</xs:schema>

<!-- ############################################################################ -->
<!-- ############################################################################ -->

<!-- XML: https://pastebin.com/JQYRvSS0  -->
<card_order_request>
  <order_id>1</order_id>
  <card>
    <card_id>100</card_id>
    <paper_carrier_id>6475</paper_carrier_id>
  </card>
  <paper_carrier paper_carrier_id="6475">
    <paper_carrier_row1>blabla01</paper_carrier_row1>
  </paper_carrier>
  <paper_carrier paper_carrier_id="6476">
    <paper_carrier_row1>blabla02</paper_carrier_row1>
  </paper_carrier>
</card_order_request>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...