2011-12-16 2 views
1

Я создал свой собственный ComplexType - Transaction.Установить атрибут/значение пользовательского сложного типа

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

Например:

<xs:complexType name="TransactionType"> 
    <xs:all minOccurs="0" maxOccurs="1"> 
    <xs:element name="Status" type="xs:string" minOccurs="1" fixed ="N" maxOccurs ="1" /> 
    <xs:element name="Amount" type="xs:decimal" minOccurs ="1" maxOccurs ="1" /> 
    </xs:all> 
    <xs:attribute name="type" type="xs:string" /> 
</xs:complexType> 

<xs:element name="Transaction" maxOccurs="unbounded"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Debit" type="TransactionType" /> 
     <xs:element name="Credit" type="TransactionType" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

для дебетовых Я хотел бы иметь значение TransactionType.Type фиксированной = «D», а для кредитного элемента Я хотел бы, чтобы это было transactionType.Type = «С»

Благодаря

ответ

1

То, что вы хотите, не может быть сделано так, как вы выразился. Я покажу по-другому, просто чтобы проиллюстрировать возможность.

Независимо от того, вы должны использовать новые типы.

Для первого подхода предполагается, что вы хотите, чтобы все частицы и атрибут в базовом типе, в отличие от частиц без атрибута (для последнего решение было бы более «элегантным» использованием расширения вместо ограничения). Что касается того, почему ограничение здесь не так полезно, должно быть легко понять после просмотра XSD.

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)--> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="TransactionType"> 
     <xs:all minOccurs="0" maxOccurs="1"> 
      <xs:element name="Status" type="xs:string" minOccurs="1" fixed ="N" maxOccurs ="1"/> 
      <xs:element name="Amount" type="xs:decimal" minOccurs ="1" maxOccurs ="1"/> 
     </xs:all> 
     <xs:attribute name="type" type="xs:string"/> 
    </xs:complexType> 
    <xs:complexType name="DebitTransactionType"> 
     <xs:complexContent> 
      <xs:restriction base="TransactionType"> 
       <xs:all> 
        <xs:element name="Status" type="xs:string" minOccurs="1" fixed ="N" maxOccurs ="1"/> 
        <xs:element name="Amount" type="xs:decimal" minOccurs ="1" maxOccurs ="1"/>     
       </xs:all> 
       <xs:attribute name="type" type="xs:string" fixed="D"/>     
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="CreditTransactionType"> 
     <xs:complexContent> 
      <xs:restriction base="TransactionType"> 
       <xs:all> 
        <xs:element name="Status" type="xs:string" minOccurs="1" fixed ="N" maxOccurs ="1"/> 
        <xs:element name="Amount" type="xs:decimal" minOccurs ="1" maxOccurs ="1"/>     
       </xs:all> 
       <xs:attribute name="type" type="xs:string" fixed="C"/>     
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="Transaction"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Debit" type="DebitTransactionType"/> 
       <xs:element name="Credit" type="CreditTransactionType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Valid XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<Transaction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd"> 
    <Debit type="D"> 
     <Amount>1</Amount> 
     <Status>N</Status> 
    </Debit> 
    <Credit type="C"> 
     <Amount>1</Amount> 
     <Status>N</Status> 
    </Credit> 
</Transaction> 

Вещь с ограничением является то, что вы должны «повторить» весь набор ... некоторые говорят не то, что элегантно.

Другой подход, если вы можете удалить атрибут из базового типа, заключается в использовании расширения.

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)--> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="TransactionType"> 
     <xs:all minOccurs="0" maxOccurs="1"> 
      <xs:element name="Status" type="xs:string" minOccurs="1" fixed ="N" maxOccurs ="1"/> 
      <xs:element name="Amount" type="xs:decimal" minOccurs ="1" maxOccurs ="1"/> 
     </xs:all> 
    </xs:complexType> 
    <xs:complexType name="DebitTransactionType"> 
     <xs:complexContent> 
      <xs:extension base="TransactionType"> 
       <xs:attribute name="type" type="xs:string" fixed="D"/>     
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="CreditTransactionType"> 
     <xs:complexContent> 
      <xs:extension base="TransactionType"> 
       <xs:attribute name="type" type="xs:string" fixed="C"/>     
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="Transaction"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Debit" type="DebitTransactionType"/> 
       <xs:element name="Credit" type="CreditTransactionType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Кажется, у вас есть какой-то избыточность, так как у вас есть значение атрибута фиксировано, и связана с именем элемента ... Если это не жесткое требование, я бы удалить атрибут ...

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