设置自定义复杂类型的属性/值

时间:2011-12-16 20:13:29

标签: xml xsd

我创建了一个自己的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”,而对于Credit元素我希望它是transactionType.Type =“C”

由于

1 个答案:

答案 0 :(得分: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>

有效的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>

似乎你有一些冗余,因为你已经修改了属性的值,并且绑定了元素的名称......如果这不是一个硬性要求,我会删除属性......