Я пытаюсь найти лучший способ проверки нижеприведенного XML-документа. Я рассмотрел три способа сделать это до сих пор:XML Validation - If Then
DTD - не похоже, что есть достаточно вариантов, чтобы это произошло.
XSD - почти работает, но я не могу найти способ сделать что-то вроде If Then
XSL - О той же проблемой, что я могу сделать, если, но я не могу понять способ заставить его работать против этого документа.
Идея такова: Корневой элемент <Answers>
. Под 1 или более <Answer>
. Они имеют атрибут идентификатора, обозначающий номер вопроса (обрабатываемый в другом месте, а не важный), который соответствует. Каждый вопрос может иметь 0 или больше ответов, которые в настоящее время написаны сейчас, как <A1>
, <A2>
... Каждый ответ имеет 1 или более элементов, которые входят в него, <E1>
, <E2>
...
Пример документа выглядит как :
<Answers>
<Answer ID="1a">
<A1>
<E1>Element 1</E1>
<E2>Element 2</E2>
<E3>Element 3</E3>
<E4>Element 4</E4>
</A1>
<A2>
<E1>Element 1</E1>
<E2>Element 2</E2>
<E3>Element 3</E3>
<E4>Element 4</E4>
</A2>
</Answer>
<Answer ID="1b">
<A1>
<E1>Element A</E1>
<E2>Element B</E2>
<E3>Element C</E3>
</A1>
</Answer>
<Answer ID="2">
<A1>
<E1>Element 1</E1>
<E2>Element 2</E2>
<E3>Element 3</E3>
<E4>Element 4</E4>
<E5>Element 5</E5>
</A1>
<A2>
<E1>Element 1</E1>
<E2>Element 2</E2>
<E3>Element 3</E3>
<E4>Element 4</E4>
<E5>Element 5</E5>
</A2>
<A3>
<E1>Element 1</E1>
<E2>Element 2</E2>
<E3>Element 3</E3>
<E4>Element 4</E4>
<E5>Element 5</E5>
</A3>
</Answer>
</Answers>
Что входит в Элементы - это любая строка, содержимое не имеет значения, поскольку она не является пустой.
Что нужно для проверки, так это то, что для каждого ответа (обозначается идентификатором) для каждого <A*>
существует определенное количество элементов. В этом примере 1а имеет 4 элементов, 1b имеет 3 и 2 имеет 5.
Формат является гибким, так что при необходимости можно изменить положение вещей на что-то вроде: Элемент A Элемент B Элемент C или что-то в этом роде.
Я пробовал всевозможные сочетания с этим, но я не могу найти способ потребовать X количество <E*>
в зависимости от идентификатора ответа.
У кого-нибудь есть мысли, или они могут указать мне в правильном направлении, даже если это просто говорит: «Да, XSD может это сделать» или «Нет, XSL не может этого сделать»?
XSLT преобразует документы - это не подтверждает их. Вы можете написать трансформацию, указывающую на элементы, которые не удовлетворяют вашим ограничениям, но вы не можете назвать эту «проверку». Это будет для вас вариант? Если нет, DTD не может этого сделать. Ваши варианты для языков валидации: XML Schema, RelaxNG и Schematron также будут способны к этому (и самому простому!). –
Другой вариант, первый, который появился у меня в голове, - XQuery. – bjimba
DTD не может этого сделать. XSD 1.0 не может этого сделать. XSD 1.1 может делать это с утверждениями. XSLT может это сделать, анализируя идентификатор и подсчитывая дочерние элементы. Итак, заберите свой яд. ;-) – kjhughes