2015-10-26 3 views
2

Я хотел бы разрешить элементу быть xs:date или пустую строку.Разрешить элемент даты XSD быть пустой строкой

Вот XML-схемы, которые я пробовал:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:lp="urn:oio:ebst:diadem:lokalplan:1" 
      targetNamespace="urn:oio:ebst:diadem:lokalplan:1" 
      elementFormDefault="qualified" xml:lang="DA" 
      xmlns:m="urn:oio:ebst:diadem:metadata:1"> 
    <xs:import schemaLocation="../key.xsd" namespace="urn:oio:ebst:diadem:metadata:1" /> 
    <xs:element name="DatoVedtaget" type="lp:DatoVedtagetType" /> 
    <xs:complexType name="DatoVedtagetType"> 
    <xs:simpleContent>  
     <xs:extension base="xs:date"> 
     <xs:attribute ref="m:key" /> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DatoVedtagetTypeString"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute ref="m:key" /> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:schema> 

Я хочу, чтобы элемент, чтобы быть в случае, включает в себя значение DatoVedtagetType, и я хочу, чтобы это было DatoVedtagetTypeString, если он пуст. Как я реализую такую ​​условную функциональность этой схемы?

+0

Разве это не просто извилистый способ сказать, что вы хотите, чтобы 'DatoVedtaget' был' xs: date' или пустым? – kjhughes

+0

Да, если это возможно –

ответ

2

Оценка достижений в области xs:date 0 0 Вот способ выразить такое ограничение:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:lp="urn:oio:ebst:diadem:lokalplan:1" 
      xmlns:m="urn:oio:ebst:diadem:metadata:1" 
      targetNamespace="urn:oio:ebst:diadem:lokalplan:1" 
      elementFormDefault="qualified" 
      xml:lang="DA"> 
    <xs:import schemaLocation="../key.xsd" namespace="urn:oio:ebst:diadem:metadata:1" /> 
    <xs:element name="DatoVedtaget" type="lp:DatoVedtagetType" /> 

    <xs:simpleType name="empty"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value=""/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="dateOrEmpty"> 
    <xs:union memberTypes="xs:date lp:empty"/> 
    </xs:simpleType> 

    <xs:complexType name="DatoVedtagetType"> 
    <xs:simpleContent> 
     <xs:extension base="lp:dateOrEmpty"> 
     <xs:attribute ref="m:key" /> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 

</xs:schema> 
1

Вместо того чтобы использовать тип профсоюза, как @kjhughes делает мое собственное предпочтительным решение заключается в использовании типа списка, позволяющий ноль или один вхождения:

<xs:simpleType name="dateOrEmpty"> 
    <xs:list itemType="xs:date" maxLength="1"/> 
</xs:simpleType> 

Одна из причин предпочтения заключается в том, что это меньше кода. Другая причина заключается в том, что, если вы пишете код XSLT или XQuery, ориентированный на схему, результирующее значение легче манипулировать (у атомизированного значения есть тип xs: date?, Который легче манипулировать, например, для проверки на пустой, чем тип объединения).

+0

Ну, если бы я подумал об этом еще один год, я бы тоже придумал идею 'xs: list'. :-) Серьезно: мне нравится этот подход. Хорошее решение. – kjhughes

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