2013-12-17 4 views
1

У меня есть ситуация, когда есть базовый тип, который я не «владею», и он позволяет всем дочерним элементам быть дополнительным. С точки зрения общего бизнеса это имеет смысл. Например, скажем, это было:переопределение minOccurs из группы

<xs:complexType name="BaseType"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:string" minOccurs="0"/> 
     <xs:element name="name" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

Экземпляр этого типа будет содержаться в содержащем типе, который использует мой процесс.

<xs:complexType name="MyType"> 
    <xs:sequence> 
     <xs:element name="Widget" type="BaseType"/> 
     ...other stuff... 
    <xs:sequence> 
</xs:complexType> 

Однако для моих конкретных целей мне нужно, чтобы элемент «id» на BaseType присутствовал всегда. Я могу обеспечить это в коде, который его потребляет, конечно, но есть ли способ представить это в xsd?

EDIT Я забыл друг друга. Есть еще одна аналогичная ситуация, когда элементы, которые я использую, относятся к группе, а не к базовому типу.

<xs:group name="Address-Group"> 
    <xs:sequence> 
     <xs:element name="street" type="xs:string" minOccurs="0"/> 
     <xs:element name="city" type="xs:string" minOccurs="0"/> 
     ...etc.... 
    </xs:sequence> 
</xs:group> 

Если я использую один из них в MyType, я бы тот же вопрос о попытке переопределить MinOccurs что-то вроде «город».

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

3

Предполагая, что for my particular purposes, I need the 'id' element on a BaseType to be present always вы на самом деле означает всегда, то вы можете применить переопределять такие, как показано ниже:

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)--> 
<xsd:schema xmlns="http://tempuri.org/XMLSchema.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:redefine schemaLocation="xsd-overriding-minoccurs-from-a-group.xsd"> 
     <xsd:complexType name="BaseType"> 
      <xsd:complexContent> 
       <xsd:restriction base="BaseType"> 
        <xsd:sequence> 
         <xsd:element name="id" type="xsd:string"/> 
         <xsd:element name="name" type="xsd:string" minOccurs="0"/> 
        </xsd:sequence> 
       </xsd:restriction> 
      </xsd:complexContent> 
     </xsd:complexType> 
     <xsd:group name="Address-Group"> 
      <xsd:sequence> 
       <xsd:element name="street" type="xsd:string"/> 
       <xsd:element name="city" type="xsd:string" minOccurs="0"/> 
      </xsd:sequence> 
     </xsd:group> 
    </xsd:redefine> 
</xsd:schema> 

Дело в том, переопределения работы «всегда», то есть во всех тех случаях, когда используется BaseType , переопределенное определение будет иметь приоритет. Другими словами, в XSD нет механизма, где вы можете выбрать и выбрать свой контекст, если только вы не перейдете на XSD 1.1, где вам тогда не понадобится переопределять, а какое-то утверждение. Проблема в том, что я бы рискнул сказать, что XSD 1.1 еще менее поддерживается, чем XSD 1.0 (на разных платформах, а не на той, которая может поддерживаться в любом случае, например, Saxon или Xerces).

XML-такие, как это справедливо:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd"> 
    <id>id1</id> 
    <name>name1</name> 
</paschidev.dummy> 

В то время как это один потерпит неудачу:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd"> 
    <name>name1</name> 
</paschidev.dummy> 

С следующее сообщение об ошибке (.NET на основе):

Error occurred while loading [], line 4 position 3 
The element 'paschidev.dummy' in namespace 'http://tempuri.org/XMLSchema.xsd' has invalid child element 'name' in namespace 'http://tempuri.org/XMLSchema.xsd'. List of possible elements expected: 'id' in namespace 'http://tempuri.org/XMLSchema.xsd'. 

или это (на основе Java):

Error while loading [], line 4 position 8 
cvc-complex-type.2.4.a: Invalid content was found starting with element 'name'. One of '{"http://tempuri.org/XMLSchema.xsd":id}' is expected. 

Редефикс хорошо работает с XML-процессорами, поддерживающими XSD. Тем не менее, некоторые XSD для привязки фреймворков привязки или движков баз данных со встроенной поддержкой XSD могут кашлять на этом.

+0

Если вы не хотите переопределять тип по всему миру, вы можете, конечно, получить другой тип путем ограничения и использовать его только в выбранных местах. Но на практике это может быть неудобно. –

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