2016-11-12 5 views
2

Цель состоит в том, чтобы ограничить BEST_FRIEND_ID иметь значение существующего атрибута FRIEND_ID в этом XML:XSD, чтобы ограничить значения элементов XML существующими значениями атрибутов XML?

friends.xml

<?xml version="1.0"?> 
<FRIENDS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="friends.xsd"> 
    <FRIEND FRIEND_ID="1"> 
     <NAME>John</NAME> 
     <BEST_FRIEND_ID>2</BEST_FRIEND_ID> 
    </FRIEND> 
    <FRIEND FRIEND_ID="2"> 
     <NAME>Kate</NAME> 
     <BEST_FRIEND_ID>1</BEST_FRIEND_ID> 
    </FRIEND> 
</FRIENDS> 

Э.Г. для данного XML проверка должна завершиться неудачно, если я изменю значение любого элемента BEST_FRIEND_ID на 3.

friends.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"> 
    <xs:complexType name="FriendsType"> 
     <xs:sequence> 
      <xs:element ref="FRIEND" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="FriendType"> 
     <xs:sequence> 
      <xs:element ref="NAME"/> 
      <xs:element ref="BEST_FRIEND_ID"/> 
     </xs:sequence> 
     <xs:attribute name="FRIEND_ID" type="xs:integer"/> 
    </xs:complexType> 

    <xs:element name="FRIENDS" type="FriendsType"/> 
    <xs:element name="FRIEND" type="FriendType"/> 
    <xs:element name="NAME" type="xs:string"/> 
    <xs:element name="BEST_FRIEND_ID" type="xs:integer"/> 
</xs:schema> 

Моя идея состояла в том, чтобы использовать силу из утверждает (XSD 1.1). Это то, что я понял, до сих пор

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:complexType name="FriendsType"> 
     <xs:sequence> 
      <xs:element ref="FRIEND" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="FriendType"> 
     <xs:sequence> 
      <xs:element ref="NAME"/> 
      <xs:element ref="BEST_FRIEND_ID"/> 
     </xs:sequence> 
     <xs:attribute name="FRIEND_ID" type="xs:integer"/> 
    </xs:complexType> 
    <xs:complexType name="IdConstrain"> 
     <xs:simpleContent> 
      <xs:extension base="xs:integer"> 
       <xs:assert test="$value = @FRIEND_ID"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

    <xs:element name="FRIENDS" type="FriendsType"/> 
    <xs:element name="FRIEND" type="FriendType"/> 
    <xs:element name="NAME" type="xs:string"/> 
    <xs:element name="BEST_FRIEND_ID" type="IdConstrain"/> 
</xs:schema> 

и проверка не пройдена:

Серьезность: ошибка Описание: CVC-утверждение: оценка Утверждение ('$ значение = @FRIEND_ID') для элемент 'BEST_FRIEND_ID' на схеме типа 'IdConstrain' не удалось. Начало местоположение: 6:10 Конец местоположение: 6:25 URL: http://www.w3.org/TR/xmlschema11-1/#cvc-assertion

Я также пытался что-то вроде BEST_FRIEND_ID[contains(., @FRIEND_ID)], но он не работает, как хорошо.

ответ

1

Вы должны использовать следующее, чтобы проверить, что каждый лучший идентификатор друга - это уже существующий идентификатор друга. Вы должны также проверить, что BestFriend идентификатор не равен самому себе:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 

    <xs:complexType name="FriendsType"> 
     <xs:sequence> 
      <xs:element ref="FRIEND" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:assert test="every $bfid in FRIEND/BEST_FRIEND_ID 
      satisfies $bfid = (FRIEND/@FRIEND_ID)"/> 
     <!-- Optional check best friend is not equals to itself --> 
     <xs:assert test="every $fr in FRIEND 
      satisfies $fr/@FRIEND_ID != $fr/BEST_FRIEND_ID"/> 
    </xs:complexType> 

    <xs:complexType name="FriendType"> 
     <xs:sequence> 
      <xs:element ref="NAME"/> 
      <xs:element ref="BEST_FRIEND_ID"/> 
     </xs:sequence> 
     <xs:attribute name="FRIEND_ID" type="xs:integer"/> 
    </xs:complexType> 

    <xs:element name="FRIENDS" type="FriendsType"/> 
    <xs:element name="FRIEND" type="FriendType"/> 
    <xs:element name="NAME" type="xs:string"/> 
    <xs:element name="BEST_FRIEND_ID" type="xs:integer"/> 
</xs:schema> 

Вы также можете проверить это BestFriend идентификатор Diferent к другу ид внутри тега FRIEND вместо FRIENDS тега.

<xs:complexType name="FriendType"> 
    <xs:sequence> 
     <xs:element ref="NAME"/> 
     <xs:element ref="BEST_FRIEND_ID"/> 
    </xs:sequence> 
    <xs:attribute name="FRIEND_ID" type="xs:integer"/> 
    <xs:assert test="@FRIEND_ID != BEST_FRIEND_ID"/> 
</xs:complexType> 
+0

Итерация через 'FRIEND/BEST_FRIEND_ID' работает по назначению. Несмотря на то, что создается новый экземпляр «FRIEND», ему не требуется назначать свой «FRIEND_ID» любому из «BEST_FRIEND_ID». Все, что делает этот ответ правильным - принимая ... – pbajsarowicz

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

  • Нет связанных вопросов^_^