2010-09-03 9 views
0

мне нужно применять ограничения в большом файле XML, например:Что разрешено в ограниченных XPath (ограничениях)?

<library> 
    <book> 
     <bookAuthor ID="1" nameAlias="PeerBR jr"/> 
    </book> 
    <book> 
     <bookAuthor ID="1"/> 
    </book> 
</library> 
<authorCatalogue> 
    <author ID="1" name="PeerBr"/> 
</authorCatalogue> 

мне нужно удостоверение личности каждого bookAuthor для обозначения действительного автора.

Я нахожу «ограниченный XPath» очень неуклюжим для работы, но, возможно, что-то не замечаю. Правильно ли я определить ограничение таким образом:

<xs:keyref name="bookAuthor" refer="author"> 
    <xs:selector xpath="library/book/bookauthor"/> 
    <xs:field xpath="@ID"/> 
</xs:keyref>   
<xs:key name="author"> 
    <xs:selector xpath="authorCatalogue/author"/> 
    <xs:field xpath="@ID"/> 
</xs:key> 

Это работает, но мой файл на самом деле более вложенный, поэтому он получает очень грязным. Плюс я должен написать новое ограничение для «library/book/CoAuthor». Нет ничего более элегантного, что я могу сделать? Не могу ли я сократить селектор?

Могу ли я ограничить применение ограничения ("bookauthor [@nameAlias]")?

Заранее за вашу помощь.

+0

Этот вопрос касается не общих выражений XPath. From: http://www.w3.org/TR/xmlschema-1/#cIdentity-constraint_Definitions '{selector} указывает ограниченное выражение XPath ([XPath]) относительно экземпляров объявляемого элемента.'. Итак, я редактировал ваши теги. Кроме того, из http://www.w3.org/TR/xmlschema-1/#coss-identity-constraint, похоже, вы можете использовать '|' оператор объединения узлов. Итак, возможно, вы могли бы использовать 'library/book/bookauthor | библиотека/книга/CoAuthor', но я не эксперт XSchema ... –

+0

@Alejandro: Да, вы совершенно правы, я прочитал схему и попробовал оператор объединения так, как вы предлагали. Благодарю. – PeerBr

ответ

4

Нашел ответ в «XML-схеме» О'Рейли. Это нормально, чтобы иметь:

  • относительные пути с дочерним элементом
  • пространств имен
  • все элементы («*»)
  • любой дочерний элемент («.//bookauthor» в моем случае будет делать хитрость)

это не нормально, чтобы включить что-нибудь фантазии, такие как:

  • ПАРЕ нт элемент
  • тесты («[@nameAlias]», поэтому нет возможности применить ограничение только для узлов с атрибутом nameAlias)
  • абсолютных путей

Надежда это помогает кому-то споткнувшись о проблеме позже.