2016-11-22 9 views
0

У меня есть документ XML (минимальный воспроизводимый пример), который выглядит следующим образом:Выражая «должен существовать» отношения в схеме XML

<root start="baz"> 
    <child name="foo">...</child> 
    <child name="bar">...</child> 
    <child name="baz">...</child> 
</root> 

Я хотел бы мою схему для обеспечения того, что атрибут на start корневой элемент должен ссылаться на существующий узел child с таким именем. Если нет дочернего узла с атрибутом name с этим значением, проверка не должна выполняться. Другими словами, выше, следует проверить, но это должно не:

<root start="baz"> 
    <child name="foo">...</child> 
    <child name="bar">...</child> 
</root> 

Что такое хороший способ сделать это? Действительно ли мне нужно использовать assert с подходящим выражением XPath или есть более естественный способ выразить это в XSD? Благодарю.

PS: предположим, что start является обязательным атрибутом, а дочерние атрибуты name отмечены уникальными в соответствующей области.

ответ

1

Вы ищете xsd:key/xsd:keyref. См:

XML Schema key/keyref - how to use them?

Возможно somethig как:

<xsd:key name="root-child-name"> 
    <xsd:selector xpath="root/child"/> 
    <xsd:field xpath="@name"/> 
</xsd:key> 
<xsd:keyref name="root-start" refer="root-child-name"> 
    <xsd:selector xpath="root"/> 
    <xsd:field xpath="@start"/> 
</xsd:keyref> 
+0

я должен был поставить 'XPath =' в KeyRef для этого, чтобы работать на меня, как бы я "" это иначе? Если 'root' на самом деле является корневым элементом, я не могу поставить keyref выше в дереве документов, поэтому xpath не может работать, и, судя по всему, в селекторе не поддерживается слэш. – Thomas