简体   繁体   中英

Extend xsd complexType with elements

Is it possible to create the extended xsd with xslt. I get an xsd from another part and want to add some elements to the xsd but I cant get it to work. Is xslt the way to go or are there some better tools?

   <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.3.19">
      <xs:element name="Message">
        <xs:annotation>
          <xs:documentation>Root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice>
              <xs:element ref="addAddress"/>
              <xs:element ref="addAddressResponse"/>
              <xs:element ref="addEmailAddress"/>
              <xs:element ref="addEmailAddressResponse"/>
            </xs:choice>
      </xs:element>

    </xs:schema>

Extended:

 <?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.3.19">
  <xs:element name="Message">
    <xs:annotation>
      <xs:documentation>Root element</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <!-- Extended field -->
        <xs:element name="generalResponse" minOccurs="0">
          <xs:annotation>
            <xs:documentation>This response </xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="plainText" type="xs:string" minOccurs="0"/>
              <xs:element name="invalidParameters" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="parameter" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="name" type="xs:string"/>
                        <xs:attribute name="errorType" type="xs:string"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:choice>
          <xs:element ref="addAddress"/>
          <xs:element ref="addAddressResponse"/>
          <xs:element ref="addEmailAddress"/>
          <xs:element ref="addEmailAddressResponse"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

I solved it with this.

<xsl:template match="node() | @*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="xs:element[@name='Message']/xs:complexType">
      <xsl:copy>
         <xs:sequence>
            <!-- Extended field -->
            <xs:element name="generalResponse" minOccurs="0">
               <xs:annotation>
                  <xs:documentation>This response</xs:documentation>
               </xs:annotation>
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="plainText" type="xs:string" minOccurs="0" />
                     <xs:element name="invalidParameters" minOccurs="0">
                        <xs:complexType>
                           <xs:sequence>
                              <xs:element name="parameter" maxOccurs="unbounded">
                                 <xs:complexType>
                                    <xs:attribute name="name" type="xs:string" />
                                    <xs:attribute name="errorType" type="xs:string" />
                                 </xs:complexType>
                              </xs:element>
                           </xs:sequence>
                        </xs:complexType>
                     </xs:element>
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
            <xsl:apply-templates select="node()" />
         </xs:sequence>
      </xsl:copy>
   </xsl:template>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM