Неверное значение ограничения - PullRequest
4 голосов
/ 23 января 2012

Я получаю следующую ошибку проверки в WebSphere MQ Broker Tool v7.0 при работе с сгенерированным .xsd:

a-props-correct.2: Invalid value constraint value '0' in attribute 'attrname'.

Соответствующим текстом .xsd является использование атрибута:

<xsd:complexType name="CTypeContent">
    <xsd:simpleContent>
        <xsd:extension base="xsd:base64Binary">
            <xsd:attribute name="attrname" type="BooleanType" use="optional" default="1" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

И определение атрибута:

  <xsd:simpleType name="BooleanType">
    <xsd:restriction base="xsd:boolean">
      <xsd:pattern value="0|1" />
    </xsd:restriction>
  </xsd:simpleType>

Я гуглил и нашел много дискуссий о SOAP и тому подобном, но это, похоже, немного от моего проекта. Я просто хочу убедиться, что логика в .xsd хорошо обоснована.

EDIT:

Ошибка исчезнет, ​​если я удалю часть атрибута по умолчанию. Это не решение для меня, но, возможно, оно помогает в диагностике.

1 Ответ

2 голосов
/ 23 января 2012

Фрагменты XSD действительны, поэтому ошибка , которую вы получаете , не имеет смысла.Я считаю, что это скорее ошибка в вашем программном обеспечении WMB.

Какую версию WMB вы используете?

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

ОБНОВЛЕНИЕ: С момента публикации я столкнулся с этим и другими подобными сценариями и понял, что схемапроцессоры ведут себя по-разному, проверяя то, что кажется в основном одним и тем же: схема, которая корректируется в соответствии со спецификацией, но практически описывает невозможность.И здесь все становится интересным относительно того, что правильно .

Возможно, этот случай немного более тонкий, поскольку он включает получение this и this справа;в основном, если задано значение по умолчанию, оно будет использовать каноническое представление связанного значения (а не строки в значении по умолчанию!).Поскольку 1 означает True для логического значения, каноническим представлением этого является строка true , которая теперь явно не соответствует шаблону (который имеет дело с лексическимпредставление - строка в основном) 0 | 1 , что, в свою очередь, делает эти два несовместимыми.Учитывая PSVI, процессор XML, поддерживающий XSD, не может создать действительный XML при применении значения по умолчанию.Это то, что говорится в сообщении об ошибке.

Чтобы показать другую невозможность, которая не помечена каким-либо процессором XSD, который я обычно использую, рассмотрите этот конкретный фрагмент:

<xsd:complexType name="Test">
    <xsd:sequence>
        <xsd:element name="Impossible" type="Test"/>
    </xsd:sequence>
</xsd:complexType>
<xsd:element name="Test" type="Test"/>

Невозможно создатьдопустимый XML из этого XSD, точно так же как имеющий default = "1" и отсутствующий атрибут в вашем случае (шаблон ограничен 0 и 1).

Для меня оба сценария несколько похоже на компилятор кода, перехватывающий (во время компиляции) условие деления на ноль - где это возможно.

...