Цель состоит в том, чтобы ограничить 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)]
, но он не работает, как хорошо.
Итерация через 'FRIEND/BEST_FRIEND_ID' работает по назначению. Несмотря на то, что создается новый экземпляр «FRIEND», ему не требуется назначать свой «FRIEND_ID» любому из «BEST_FRIEND_ID». Все, что делает этот ответ правильным - принимая ... – pbajsarowicz