Можно ли ограничить количество элементов до максимума в блоке «выбора»? - PullRequest
4 голосов
/ 23 февраля 2011

Мне нужно решить следующую проблему.

// псевдоалгоритм

  • у вас есть четыре элемента: elm1, elm2, elm3, elm4
  • elm1 происходит0-2 раза
  • elm2 встречается 0-1 раз
  • elm3 встречается 0-n раз
  • elm4 встречается 0-n раз
  • их можно заказатьв любом случае, но встречаются ограниченные их заданным количеством.

// pseudo end

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

образец: elm4 elm1 elm2 elm3 elm3 elm3 elm4

пожалуйста, спасите меня, прежде чем я сойду с ума:)

Крис

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

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

Лучшее решение - использовать инструменткоторый поддерживает XML Schema 1.1 (например, Xerces или Saxon ), что ослабляет ограничения на значения all вхождения группы.Из раздела G.1.3 спецификации:

  1. Некоторые ограничения, наложенные версией 1.0 этой спецификации на все группы, были ослаблены:

    а.Подстановочные знаки теперь разрешены во всех группах.

    b.Значение maxOccurs теперь может быть больше 1 для частиц во всей группе.Элементы, которые соответствуют конкретной частице, не обязательно должны быть смежными на входе.

    c.теперь все группы можно расширять, добавляя в них больше членов.

В противном случае общее решение XML Schema 1.0 состоит в том, чтобы указать упрощенную модель в схеме (без ограниченийэлементов), а затем принудительно применяйте ограничения, которые вас интересуют, на другом уровне, например, в пользовательском коде или XSLT.

1 голос
/ 26 февраля 2011

Нет, я не думаю, что это возможно.Ваши требования кажутся взаимоисключающими.Вы можете иметь:

Элементы в любом порядке, но не более одного (или нуля) каждого типа

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="elm1" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm2" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm3" minOccurs="0" maxOccurs="1"/>
                <xs:element name="elm4" minOccurs="0" maxOccurs="1"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0" ?>
<root>
    <elm4 />
    <elm1 />
    <elm3 />
</root>

или

Элементы в фиксированном порядке и каждый с определенным числом вхождений

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="elm1" minOccurs="0" maxOccurs="2" />
                <xs:element name="elm2" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm3" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elm4" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0"?>
<root>
    <elm1 />
    <elm1 />
    <elm2 />
    <elm4 />
    <elm4 />
    <elm4 />
    <elm4 />
</root>
0 голосов
/ 26 февраля 2011

Это невозможно в xml-схеме. Вы можете использовать выбор в сочетании с чем-то вроде schematron:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern>
    <title>Occurance rules</title>
    <rule context="elm1">
        <assert test="(count(//elm1) &gt; 0) and (count(//elm1) &lt; 3)">an error message</assert>
    </rule>
</pattern>

0 голосов
/ 25 февраля 2011

Вы всегда можете использовать атрибуты minOccurs и maxOccurs в XSD-схеме.Это позволит вам установить количество элементов, которые разрешены в конкретном элементе.Больше информации в этом руководстве

Пример того, как это используется в блоке выбора, представлен здесь , например:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
   <xs:element name="document">
      <xs:complexType>
         <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element name="A" minOccurs="1" maxOccurs="1"/>
            <xs:element name="B" minOccurs="0" maxOccurs="3" />
            <xs:element name="C" minOccurs="0" maxOccurs="1"/>
         </xs:choice>
      </xs:complexType>
   </xs:element>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...