2016-03-03 2 views
1

Я хочу проверить, существует ли дочерний элемент с определенным атрибутом.XSD утверждают, что существуют определенные дочерние элементы

E.g.

<?xml version="1.0" encoding="UTF-8"?> 
<mc:PropertyGroupStructure xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
xmlns:mc="de.mycompany.propertygroupstructure" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="de.mycompany.propertygroupstructure file:PGroupStructure.xsd"> 
<mc:Property id="awesome" rename="Awesome Renaming" /> 
<mc:Category name="Common"> 
    <mc:Property id="Note"/> 
    <mc:Property id="Other" /> 
</mc:Category> 
<mc:Property id="aaa"></pc:Property> 
</mc:PropertyGroupStructure> 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" 
    vc:minVersion="1.1" targetNamespace="de.mycompany.propertygroupstructure" 
    xmlns="de.mycompany.propertygroupstructure"> 
    <xs:element name="PropertyGroupStructure" type="PropertyGroupStructureType"> 
     <xs:unique name="UniqueId"> 
      <xs:selector xpath="./* | ./*/*"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
    <xs:complexType name="PropertyGroupStructureType"> 
     <xs:choice minOccurs="1" maxOccurs="unbounded"> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="Property" type="PropertyType"/> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="Category" type="CategoryType"/> 
     </xs:choice> 
     <xs:assert test="Property[@id eq 'awesome']" /> 
    </xs:complexType> 
    <xs:complexType name="PropertyType"> 
     <xs:attribute name="id" type="xs:string" use="required"/> 
     <xs:attribute name="rename" type="xs:string" /> 
     <xs:assert test="(@id ne 'awesome') or 
         (@id eq 'awesome' and exists(@rename) and (@rename eq 'Awesome Renaming')) /> 
    </xs:complexType> 
    <xs:complexType name="CategoryType"> 
     <xs:sequence> 
      <xs:element name="Property" type="PropertyType" maxOccurs="unbounded" minOccurs="1"/> 
     </xs:sequence> 
     <xs:attribute name="name" use="required"/> 
    </xs:complexType> 
</xs:schema> 

Но Xerces всегда говорит мне "Утверждение не удалось".

Возможно, синтаксис XPath неверен?

Редактировать: Я заменил оригинальный упрощенный пример на полный.

ответ

1

Основная проблема заключается в том, что ваше утверждение тестируется на ele/@name, но ваш XML имеет ele/@attr. Исправление этой проблемы и упрощая, получаем следующее утверждение,

<xs:assert test="ele[@attr eq 'awesome']" /> 

, который будет успешно проверки против вашего XML, в соответствии с просьбой.

+0

Спасибо! Это не работает. Я отредактировал свой OP и заменил упрощенный пример на полный. Он все еще не работает. Вы знаете, что я делаю неправильно здесь? – Catscratch

+0

Хм, может быть, какой-нибудь совет? :-) Благодаря! – Catscratch

+0

Теперь ваш XML имеет 'rename =" Awesome Rename "', но ваш XSD утверждает 'rename =" Awesome Renaming "'. Отдельно ваше утверждение также может быть упрощено с использованием базовой булевой алгебры. – kjhughes

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