2015-11-26 4 views
1

У меня есть небольшая проблема с существующим XSD и дополнительным правилом, которое я хочу реализовать. Вот часть моего оригинального XSD:XSD со строгой комбинацией

<xs:complexType name="action"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
      <xs:attribute name="actid" type="xs:string" use="required" /> 
      <xs:attribute name="acttyp" type="acttype" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

<xs:simpleType name="acttype"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="type1" /> 
     <xs:enumeration value="type2" /> 
     <xs:enumeration value="type3" /> 
     <xs:enumeration value="type4" /> 
    </xs:restriction> 
</xs:simpleType> 

Итак, вы видите, что существуют действия с различными типами действий, которые я определил. Теперь есть новое правило, если есть специальный actid, давайте возьмем «123», чем разрешен только тип1. Так, чтобы показать вам:

<action actid="123" acttype="type1"> = permitted 
<action actid="234" acttype="type1"> = permitted 
<action actid="234" acttype="type2"> = permitted 
<action actid="123" acttype="type2"> = forbidden 

Есть ли способ сделать это с XSD? Я не знаю, как объединить перечисление с этим правилом. Кто-нибудь может мне помочь?

ответ

0

В XSD 1.1, это можно сделать, используя xs:assert.

<xs:assert test="if (@actid = '123') then @acttyp = 'type1' else true()"/>. 

ваш код XSD следует переписать следующим образом:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 

    <xs:complexType name="action"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="actid" type="xs:string" use="required"/> 
       <xs:attribute name="acttyp" type="acttype" use="required"/> 
       <xs:assert 
        test=" 
         if (@actid = '123') then 
          @acttyp = 'type1' 
         else 
          true()"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

    <xs:simpleType name="acttype"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="type1"/> 
      <xs:enumeration value="type2"/> 
      <xs:enumeration value="type3"/> 
      <xs:enumeration value="type4"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:element name="e" type="action"/> 
</xs:schema> 
+0

Здравствуйте Kachna и спасибо за Ваш ответ, выглядит довольно хорошо для меня, но я получаю сообщение об ошибке с помощью XSD. s4s-elt-invalid-content.1: Содержимое «действия» недействительно. Элемент «assert» недействителен, неуместен или встречается слишком часто. Я думаю, что проблема заключается в нашей версии XSD-Parser. К сожалению, у нас нет поддержки XSD 1.1 Parser и Xpath 2.0 в нашем проекте, и я также не уполномочен изменять это. Есть ли способ сделать то же самое с XSD 1.0? – Arronax

+0

AFAIk, это не может быть сделано с использованием XSD 1.0. – Kachna

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