2015-04-01 3 views
3

У меня есть XML, который выглядит следующим образом:Предельное число вхождений элемента на основании значения атрибута

<Artifacts count="2"> 
    <Artifact> 
    ... 
    </Artifact> 
    <Artifact> 
    ... 
    </Artifact> 
</Artifacts> 

Я ищу способ обеспечения соблюдения, что число Artifact элементов, содержащихся в Artifact с должны быть равно значению атрибута «count», используя схему XSD.

Несмотря на то, что я нашел возможные способы достижения этого, используя спецификацию XSD 1.1, я задаюсь вопросом, возможно ли это без него, то есть на основе спецификации XSD 1.0.


Редактировать: Я попытаюсь предоставить немного больше контекста на вопрос, чтобы быть более точным.
XML-файл будет предоставлен как вход в приложение C++. Проблема заключается в том, что среда разработки обеспечивает использование библиотеки Xerces v. 2.8.0 для синтаксического анализа. Насколько я понимаю, эта версия не поддерживает стандарт XSD 1.1.

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

ответ

2

Правильный термин для типа ограничения, который вы хотели бы моделировать, - утверждение. Нет, утверждения в XML Schema 1.0 невозможны. Единственными языками валидации, которые поддерживают утверждения, являются XML Schema 1.1 (xs:assert) и Schematron (sch:assert и sch:report).

Кроме того, вы можете написать XPath выражения или XSLT стилей, которые проверяют на правильное количество Artifact элементов:

/Artifacts/@count = count(/Artifacts/Artifact) 

XML-файл будет представлена ​​в качестве входных данных для C++ приложения , Проблема заключается в том, что среда разработки обеспечивает использование библиотеки Xerces v. 2.8.0 для синтаксического анализа. Насколько я понимаю, эта версия не поддерживает стандарт XSD 1.1.

Я думаю, что Xerces 2.8.0 (устаревшая версия, которая больше не поддерживается) не соответствует XSD 1.1, но самый простой способ узнать это просто тест его. Включите любой код xs:assert в схему и посмотрите, что произойдет.

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

Нет, только с XSD 1.0 вы не можете избежать лишних строк кода.


EDIT Что @kjhughes написал в комментарии должны быть на самом деле часть ответа:

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

С точки зрения дизайна XML, если этот атрибут не делает ничего другого, кроме государства, сколько Artifact элементов есть, почему вы включили его в первую очередь? Вы всегда должны неохотно хранить резервные и извлекаемые информации. Например, нет необходимости хранить положение дочерних элементов так:

<root> 
    <child n="1"/> 
    <child n="2"/> 
</root> 

И ваш атрибут count делает что-то очень похожее.

+0

Спасибо за ваш ответ. Я надеялся, что будет способ манипулировать схемой, чтобы делать мои ставки, но кажется, что нет. Я дам ему еще немного времени, чтобы узнать, появляются ли какие-то сумасшедшие идеи от других пользователей, иначе этот ответ велик и правилен! Тем временем я создаю схему с этим ограничением в виду, и я рассматриваю способы включения XLST и XPath. – Vag

+0

Это правильно, и я бы также бросил вызов дизайну OP, который требует атрибута, который просто отражает количество дочерних атрибутов. – kjhughes

+0

@kjhughes Хорошая мысль, я попытался изменить это в своем ответе - дайте мне знать, если это все еще нуждается в улучшении. –

1

Я буду считать, что значение счета динамически зависит от фактического количества элементов артефакта. Один из способов (так как я не знаю, что ваш контекст) может быть модифицировать XSD с MinOccurs и MaxOccurs в соответствии с этим значением, а затем проверку по новой схеме ...

<xsd:complexType name="Artifacts"> 
    <xsd:sequence> 
     <xsd:element name="Artifact" minOccurs="COUNT_VALUE" maxOccurs="COUNT_VALUE" />  
    </xsd:sequence> 
</xsd:complexType> 
+0

Значение 'minOccurs' должно быть 0 или положительное целое число,« COUNT_VALUE »не будет работать. –

+0

вы правы @ Mathias о minOccurs! почему установка maxOccurs в качестве того же значения, что и атрибут count из разобранного ввода xml, сохранение в новую схему и проверка на соответствие новой, не будет работать? – exoddus

+0

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