Установить атрибут / значение пользовательского сложного типа - PullRequest
1 голос
/ 17 декабря 2011

Я создал свой собственный 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", а для элемента "Кредит" я хотел бы, чтобы он был транзакцииType.Type = "C"

Спасибо

1 Ответ

1 голос
/ 17 декабря 2011

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

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

Для первого подхода предполагается, что вам нужны все частицы и атрибут в базовом типе, а не частицы без атрибута (для последнего решение будет более «элегантным» использованиемрасширение вместо ограничения).Относительно того, почему ограничение не так уж полезно здесь, должно быть легко понять, посмотрев на 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>

Допустимый 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>

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

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