2013-11-12 4 views
1

Скажем, у меня есть следующий XML-документ:XSD динамическое перечисление на основе XML

<root> 
    <genres> 
    <genre name="comedy" /> 
    <genre name="academic" /> 
    </genres> 
    <authors> 
    <author name="Thomson"> 
     <writings> 
     <writing genre="academic">The text book</writing> 
     <writing genre="comedy">The worst comedy</writing> 
     <writings> 
    </author> 
    </authors> 
    <readers> 
    <reader name="Phil"> 
     <read writenBy="Thomson">The text book</read> 
    </reader> 
    <reader name="John" /> 
    </readers> 
</root> 

Как вы можете видеть, что элемент 'читателя может не иметь «читать» Чайлдс.
Однако, я хочу, чтобы процесс проверки, чтобы убедиться, что нет записи, как:

<reader name="Paul"> 
    <read writtenBy="Thomson">A writing the author never wrote</read> 
</reader> 

Что я могу сделать, это предел значения атрибута может взять на основе предварительно определенных атрибутов с помощью клавиш и keyrefs (см accepted answer). Исходя из этого, я могу убедиться, что атрибут «writtenBy» на самом деле относится к имени автора, или атрибут жанра записи относится к ранее определенному жанру.

Я знаю, что вы можете перечислять жесткие коды на документе XSD (см. accepted answer).
Кроме того, вы можете использовать утверждения (в XSD 1.1) для более гибких перечислений на основе информации, содержащейся в XML (см. accepted answer).
Но я не могу использовать эти apporaches, потому что они жестко закодированы. Есть ли способ сделать аналогичную проверку для значений элементов, как я сейчас делаю это со значениями атрибутов?

ответ

1

Есть несколько возможностей. Во-первых, вы можете сделать что-то умное с ключом и ключом, который проверяет, что содержимое элемента read является содержимым элемента writing соответствующим автором.

Было бы проще, однако, дать каждому письму идентификатор и просто сделать элемент read ссылкой на этот идентификатор. Если вы устраните избыточность, вы устраните необходимость проверки на согласованность. Разумеется, для демонстрации вы всегда можете использовать XSLT для извлечения имен автора и записи.

Если вы не можете нажать клавишу key и keyref дальше, и вы не хотите устранять избыточность в своем XML-представлении, тогда самый простой способ проверить указанное вами ограничение - с утверждением либо в XSD 1.1, либо в Schematron.

Из них я бы рекомендовал второй (реструктурировать XML, чтобы упростить и упростить проверку на достоверность). Ваше предпочтение, конечно, может отличаться.

+0

Да, мой составленный пример может быть улучшен. Тем не менее, вы дали мне хорошую идею, которая включает в себя определение «перечисления» с уникальными идентификаторами, а затем использовать ключи и keyrefs для их проверки. –

1

Если я правильно понимаю вас, то ключ/keyref может ALMOST обрабатывать его. На уровне общего предка (корень), вы хотите, чтобы определить ключ с

* selector = authors/author/writings/writing 
* fields = 
    (a) ../../@name 
    (b) . 

и определить KeyRef с

* selector = readers/reader/read 
* fields = 
    (a) @writtenBy 
    (b) . 

Единственная проблема заключается в том, что вы не можете использовать ../../@name - вы не можете ссылаться на атрибут предка в подмножестве XPath, разрешенном для ключей и keyref. Я не вижу решения для этого, кроме как (а) изменения дизайна XML для копирования имени автора в элементе «write», или (b) вместо утверждений XSD 1.1.

+0

Я подумывал об изменении дизайна и давал каждому написанию идентификатор в качестве атрибута. Думаю, будет легче. Использование утверждений звучит интересно, но все примеры, которые я видел, используют предопределенные перечисления.У вас есть простой пример, объясняющий это? Возможно, ссылка на пример? –

+0

Нет У меня нет примеров. (Если бы я мог так сказать, вы, похоже, очень полагались на поиск кода, который уже написаны другими людьми ...) –

Смежные вопросы