/*
 * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Martin Vojtek - 2.6.0 - initial implementation
package org.eclipse.persistence.testing.perf.largexml.bigpo.common_aggregate_components;

import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlElementDecl;
import jakarta.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;


/**
 * This object contains factory methods for each
 * Java content interface and Java element interface
 * generated in the org.eclipse.persistence.testing.perf.largexml.bigpo.common_aggregate_components package.
 * <p>An ObjectFactory allows you to programatically
 * construct new instances of the Java representation
 * for XML content. The Java representation of XML
 * content can consist of schema derived interfaces
 * and classes representing the binding of schema
 * type definitions, element declarations and model
 * groups.  Factory methods for each of these are
 * provided in this class.
 *
 */
@XmlRegistry
public class ObjectFactory {

    private final static QName _MaximumTemperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "MaximumTemperature");
    private final static QName _LotIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "LotIdentification");
    private final static QName _TransportEquipmentSeal_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TransportEquipmentSeal");
    private final static QName _MeasurementDimension_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "MeasurementDimension");
    private final static QName _ReceiptLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ReceiptLine");
    private final static QName _Communication_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Communication");
    private final static QName _SalesConditions_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SalesConditions");
    private final static QName _SecondaryHazard_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SecondaryHazard");
    private final static QName _DespatchLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DespatchLine");
    private final static QName _LocationCoordinate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "LocationCoordinate");
    private final static QName _TaxSubTotal_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TaxSubTotal");
    private final static QName _ShippingContact_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ShippingContact");
    private final static QName _TransitPeriod_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TransitPeriod");
    private final static QName _PenaltyPeriod_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PenaltyPeriod");
    private final static QName _AddressLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "AddressLine");
    private final static QName _JurisdictionAddress_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "JurisdictionAddress");
    private final static QName _Party_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Party");
    private final static QName _RegistrationAddress_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "RegistrationAddress");
    private final static QName _CommodityClassification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CommodityClassification");
    private final static QName _HazardousGoodsTransit_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "HazardousGoodsTransit");
    private final static QName _ItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ItemIdentification");
    private final static QName _BasePrice_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "BasePrice");
    private final static QName _HazardousItem_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "HazardousItem");
    private final static QName _Branch_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Branch");
    private final static QName _DespatchAddress_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DespatchAddress");
    private final static QName _Address_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Address");
    private final static QName _Shipment_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Shipment");
    private final static QName _Temperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Temperature");
    private final static QName _AdditionalItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "AdditionalItemIdentification");
    private final static QName _FinancialAccount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "FinancialAccount");
    private final static QName _TransportEquipment_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TransportEquipment");
    private final static QName _ShipmentStage_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ShipmentStage");
    private final static QName _FinancialInstitutionBranch_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "FinancialInstitutionBranch");
    private final static QName _PayeeFinancialAccount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PayeeFinancialAccount");
    private final static QName _SellerParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SellerParty");
    private final static QName _HandlingUnitDespatchLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "HandlingUnitDespatchLine");
    private final static QName _DestinationParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DestinationParty");
    private final static QName _BuyersItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "BuyersItemIdentification");
    private final static QName _TaxTotal_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TaxTotal");
    private final static QName _LegalTotal_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "LegalTotal");
    private final static QName _InvoiceLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "InvoiceLine");
    private final static QName _DeliveryAddress_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DeliveryAddress");
    private final static QName _TransportHandlingUnit_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TransportHandlingUnit");
    private final static QName _OrderedShipment_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderedShipment");
    private final static QName _FlashpointTemperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "FlashpointTemperature");
    private final static QName _AccountsContact_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "AccountsContact");
    private final static QName _OriginCountry_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OriginCountry");
    private final static QName _LineItem_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "LineItem");
    private final static QName _SellerSubstitutedLineItem_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SellerSubstitutedLineItem");
    private final static QName _CarrierParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CarrierParty");
    private final static QName _CardAccount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CardAccount");
    private final static QName _Dimension_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Dimension");
    private final static QName _Contact_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Contact");
    private final static QName _Item_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Item");
    private final static QName _BuyerProposedSubstituteLineItem_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "BuyerProposedSubstituteLineItem");
    private final static QName _PaymentMeans_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PaymentMeans");
    private final static QName _Payment_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Payment");
    private final static QName _BuyerParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "BuyerParty");
    private final static QName _SellersItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SellersItemIdentification");
    private final static QName _PaymentTerms_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PaymentTerms");
    private final static QName _Country_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Country");
    private final static QName _SellerProposedSubstituteLineItem_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SellerProposedSubstituteLineItem");
    private final static QName _PartyTaxScheme_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PartyTaxScheme");
    private final static QName _MinimumTemperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "MinimumTemperature");
    private final static QName _ReceivedHandlingUnitReceiptLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ReceivedHandlingUnitReceiptLine");
    private final static QName _CreditAccount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CreditAccount");
    private final static QName _CatalogueItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CatalogueItemIdentification");
    private final static QName _ManufacturersItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ManufacturersItemIdentification");
    private final static QName _PayerFinancialAccount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PayerFinancialAccount");
    private final static QName _Period_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Period");
    private final static QName _Language_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Language");
    private final static QName _DeliveryTerms_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DeliveryTerms");
    private final static QName _OrderLineReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderLineReference");
    private final static QName _OrderContact_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderContact");
    private final static QName _PhysicalAttribute_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PhysicalAttribute");
    private final static QName _ValidityPeriod_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ValidityPeriod");
    private final static QName _ContainedPackage_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ContainedPackage");
    private final static QName _PartyName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PartyName");
    private final static QName _ExchangeRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ExchangeRate");
    private final static QName _ReceiptLineReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ReceiptLineReference");
    private final static QName _DocumentReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DocumentReference");
    private final static QName _ActualPackage_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ActualPackage");
    private final static QName _AdditionalTemperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "AdditionalTemperature");
    private final static QName _OrderedItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderedItemIdentification");
    private final static QName _StandardItemIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "StandardItemIdentification");
    private final static QName _CatalogueDocumentReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "CatalogueDocumentReference");
    private final static QName _TaxScheme_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TaxScheme");
    private final static QName _Package_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Package");
    private final static QName _TaxCategory_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TaxCategory");
    private final static QName _DespatchLineReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "DespatchLineReference");
    private final static QName _PartyIdentification_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "PartyIdentification");
    private final static QName _ForeignExchangeContract_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ForeignExchangeContract");
    private final static QName _OtherCommunication_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OtherCommunication");
    private final static QName _SettlementPeriod_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "SettlementPeriod");
    private final static QName _OrderReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderReference");
    private final static QName _IssuerParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "IssuerParty");
    private final static QName _AllowanceCharge_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "AllowanceCharge");
    private final static QName _FinancialInstitution_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "FinancialInstitution");
    private final static QName _EmergencyTemperature_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "EmergencyTemperature");
    private final static QName _Contract_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Contract");
    private final static QName _ContactParty_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "ContactParty");
    private final static QName _LineReference_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "LineReference");
    private final static QName _OrderLine_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "OrderLine");
    private final static QName _TransportContract_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "TransportContract");
    private final static QName _Delivery_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", "Delivery");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.eclipse.persistence.testing.perf.largexml.bigpo.common_aggregate_components
     *
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link BasePriceType }
     *
     */
    public BasePriceType createBasePriceType() {
        return new BasePriceType();
    }

    /**
     * Create an instance of {@link SalesConditionsType }
     *
     */
    public SalesConditionsType createSalesConditionsType() {
        return new SalesConditionsType();
    }

    /**
     * Create an instance of {@link DeliveryType }
     *
     */
    public DeliveryType createDeliveryType() {
        return new DeliveryType();
    }

    /**
     * Create an instance of {@link PartyType }
     *
     */
    public PartyType createPartyType() {
        return new PartyType();
    }

    /**
     * Create an instance of {@link ReceiptLineType }
     *
     */
    public ReceiptLineType createReceiptLineType() {
        return new ReceiptLineType();
    }

    /**
     * Create an instance of {@link TaxSubTotalType }
     *
     */
    public TaxSubTotalType createTaxSubTotalType() {
        return new TaxSubTotalType();
    }

    /**
     * Create an instance of {@link OrderLineReferenceType }
     *
     */
    public OrderLineReferenceType createOrderLineReferenceType() {
        return new OrderLineReferenceType();
    }

    /**
     * Create an instance of {@link ItemType }
     *
     */
    public ItemType createItemType() {
        return new ItemType();
    }

    /**
     * Create an instance of {@link ContractType }
     *
     */
    public ContractType createContractType() {
        return new ContractType();
    }

    /**
     * Create an instance of {@link BranchType }
     *
     */
    public BranchType createBranchType() {
        return new BranchType();
    }

    /**
     * Create an instance of {@link LineReferenceType }
     *
     */
    public LineReferenceType createLineReferenceType() {
        return new LineReferenceType();
    }

    /**
     * Create an instance of {@link DeliveryTermsType }
     *
     */
    public DeliveryTermsType createDeliveryTermsType() {
        return new DeliveryTermsType();
    }

    /**
     * Create an instance of {@link PartyNameType }
     *
     */
    public PartyNameType createPartyNameType() {
        return new PartyNameType();
    }

    /**
     * Create an instance of {@link OrderReferenceType }
     *
     */
    public OrderReferenceType createOrderReferenceType() {
        return new OrderReferenceType();
    }

    /**
     * Create an instance of {@link TemperatureType }
     *
     */
    public TemperatureType createTemperatureType() {
        return new TemperatureType();
    }

    /**
     * Create an instance of {@link AddressType }
     *
     */
    public AddressType createAddressType() {
        return new AddressType();
    }

    /**
     * Create an instance of {@link LegalTotalType }
     *
     */
    public LegalTotalType createLegalTotalType() {
        return new LegalTotalType();
    }

    /**
     * Create an instance of {@link LotIdentificationType }
     *
     */
    public LotIdentificationType createLotIdentificationType() {
        return new LotIdentificationType();
    }

    /**
     * Create an instance of {@link AddressLineType }
     *
     */
    public AddressLineType createAddressLineType() {
        return new AddressLineType();
    }

    /**
     * Create an instance of {@link CardAccountType }
     *
     */
    public CardAccountType createCardAccountType() {
        return new CardAccountType();
    }

    /**
     * Create an instance of {@link ShipmentType }
     *
     */
    public ShipmentType createShipmentType() {
        return new ShipmentType();
    }

    /**
     * Create an instance of {@link CommunicationType }
     *
     */
    public CommunicationType createCommunicationType() {
        return new CommunicationType();
    }

    /**
     * Create an instance of {@link PartyIdentificationType }
     *
     */
    public PartyIdentificationType createPartyIdentificationType() {
        return new PartyIdentificationType();
    }

    /**
     * Create an instance of {@link OrderedShipmentType }
     *
     */
    public OrderedShipmentType createOrderedShipmentType() {
        return new OrderedShipmentType();
    }

    /**
     * Create an instance of {@link PaymentTermsType }
     *
     */
    public PaymentTermsType createPaymentTermsType() {
        return new PaymentTermsType();
    }

    /**
     * Create an instance of {@link SellerPartyType }
     *
     */
    public SellerPartyType createSellerPartyType() {
        return new SellerPartyType();
    }

    /**
     * Create an instance of {@link BuyerPartyType }
     *
     */
    public BuyerPartyType createBuyerPartyType() {
        return new BuyerPartyType();
    }

    /**
     * Create an instance of {@link TransportHandlingUnitType }
     *
     */
    public TransportHandlingUnitType createTransportHandlingUnitType() {
        return new TransportHandlingUnitType();
    }

    /**
     * Create an instance of {@link DespatchLineType }
     *
     */
    public DespatchLineType createDespatchLineType() {
        return new DespatchLineType();
    }

    /**
     * Create an instance of {@link PaymentMeansType }
     *
     */
    public PaymentMeansType createPaymentMeansType() {
        return new PaymentMeansType();
    }

    /**
     * Create an instance of {@link CountryType }
     *
     */
    public CountryType createCountryType() {
        return new CountryType();
    }

    /**
     * Create an instance of {@link InvoiceLineType }
     *
     */
    public InvoiceLineType createInvoiceLineType() {
        return new InvoiceLineType();
    }

    /**
     * Create an instance of {@link ExchangeRateType }
     *
     */
    public ExchangeRateType createExchangeRateType() {
        return new ExchangeRateType();
    }

    /**
     * Create an instance of {@link ShipmentStageType }
     *
     */
    public ShipmentStageType createShipmentStageType() {
        return new ShipmentStageType();
    }

    /**
     * Create an instance of {@link TransportEquipmentSealType }
     *
     */
    public TransportEquipmentSealType createTransportEquipmentSealType() {
        return new TransportEquipmentSealType();
    }

    /**
     * Create an instance of {@link LineItemType }
     *
     */
    public LineItemType createLineItemType() {
        return new LineItemType();
    }

    /**
     * Create an instance of {@link LocationCoordinateType }
     *
     */
    public LocationCoordinateType createLocationCoordinateType() {
        return new LocationCoordinateType();
    }

    /**
     * Create an instance of {@link FinancialInstitutionType }
     *
     */
    public FinancialInstitutionType createFinancialInstitutionType() {
        return new FinancialInstitutionType();
    }

    /**
     * Create an instance of {@link HazardousGoodsTransitType }
     *
     */
    public HazardousGoodsTransitType createHazardousGoodsTransitType() {
        return new HazardousGoodsTransitType();
    }

    /**
     * Create an instance of {@link ItemIdentificationType }
     *
     */
    public ItemIdentificationType createItemIdentificationType() {
        return new ItemIdentificationType();
    }

    /**
     * Create an instance of {@link ContactType }
     *
     */
    public ContactType createContactType() {
        return new ContactType();
    }

    /**
     * Create an instance of {@link TaxTotalType }
     *
     */
    public TaxTotalType createTaxTotalType() {
        return new TaxTotalType();
    }

    /**
     * Create an instance of {@link PaymentType }
     *
     */
    public PaymentType createPaymentType() {
        return new PaymentType();
    }

    /**
     * Create an instance of {@link PhysicalAttributeType }
     *
     */
    public PhysicalAttributeType createPhysicalAttributeType() {
        return new PhysicalAttributeType();
    }

    /**
     * Create an instance of {@link OrderLineType }
     *
     */
    public OrderLineType createOrderLineType() {
        return new OrderLineType();
    }

    /**
     * Create an instance of {@link AllowanceChargeType }
     *
     */
    public AllowanceChargeType createAllowanceChargeType() {
        return new AllowanceChargeType();
    }

    /**
     * Create an instance of {@link TransportEquipmentType }
     *
     */
    public TransportEquipmentType createTransportEquipmentType() {
        return new TransportEquipmentType();
    }

    /**
     * Create an instance of {@link LanguageType }
     *
     */
    public LanguageType createLanguageType() {
        return new LanguageType();
    }

    /**
     * Create an instance of {@link HazardousItemType }
     *
     */
    public HazardousItemType createHazardousItemType() {
        return new HazardousItemType();
    }

    /**
     * Create an instance of {@link TaxSchemeType }
     *
     */
    public TaxSchemeType createTaxSchemeType() {
        return new TaxSchemeType();
    }

    /**
     * Create an instance of {@link TaxCategoryType }
     *
     */
    public TaxCategoryType createTaxCategoryType() {
        return new TaxCategoryType();
    }

    /**
     * Create an instance of {@link PeriodType }
     *
     */
    public PeriodType createPeriodType() {
        return new PeriodType();
    }

    /**
     * Create an instance of {@link PartyTaxSchemeType }
     *
     */
    public PartyTaxSchemeType createPartyTaxSchemeType() {
        return new PartyTaxSchemeType();
    }

    /**
     * Create an instance of {@link DimensionType }
     *
     */
    public DimensionType createDimensionType() {
        return new DimensionType();
    }

    /**
     * Create an instance of {@link SecondaryHazardType }
     *
     */
    public SecondaryHazardType createSecondaryHazardType() {
        return new SecondaryHazardType();
    }

    /**
     * Create an instance of {@link FinancialAccountType }
     *
     */
    public FinancialAccountType createFinancialAccountType() {
        return new FinancialAccountType();
    }

    /**
     * Create an instance of {@link PackageType }
     *
     */
    public PackageType createPackageType() {
        return new PackageType();
    }

    /**
     * Create an instance of {@link CreditAccountType }
     *
     */
    public CreditAccountType createCreditAccountType() {
        return new CreditAccountType();
    }

    /**
     * Create an instance of {@link CommodityClassificationType }
     *
     */
    public CommodityClassificationType createCommodityClassificationType() {
        return new CommodityClassificationType();
    }

    /**
     * Create an instance of {@link DocumentReferenceType }
     *
     */
    public DocumentReferenceType createDocumentReferenceType() {
        return new DocumentReferenceType();
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "MaximumTemperature")
    public JAXBElement<TemperatureType> createMaximumTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_MaximumTemperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LotIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "LotIdentification")
    public JAXBElement<LotIdentificationType> createLotIdentification(LotIdentificationType value) {
        return new JAXBElement<LotIdentificationType>(_LotIdentification_QNAME, LotIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TransportEquipmentSealType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TransportEquipmentSeal")
    public JAXBElement<TransportEquipmentSealType> createTransportEquipmentSeal(TransportEquipmentSealType value) {
        return new JAXBElement<TransportEquipmentSealType>(_TransportEquipmentSeal_QNAME, TransportEquipmentSealType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DimensionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "MeasurementDimension")
    public JAXBElement<DimensionType> createMeasurementDimension(DimensionType value) {
        return new JAXBElement<DimensionType>(_MeasurementDimension_QNAME, DimensionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ReceiptLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ReceiptLine")
    public JAXBElement<ReceiptLineType> createReceiptLine(ReceiptLineType value) {
        return new JAXBElement<ReceiptLineType>(_ReceiptLine_QNAME, ReceiptLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CommunicationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Communication")
    public JAXBElement<CommunicationType> createCommunication(CommunicationType value) {
        return new JAXBElement<CommunicationType>(_Communication_QNAME, CommunicationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SalesConditionsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SalesConditions")
    public JAXBElement<SalesConditionsType> createSalesConditions(SalesConditionsType value) {
        return new JAXBElement<SalesConditionsType>(_SalesConditions_QNAME, SalesConditionsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SecondaryHazardType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SecondaryHazard")
    public JAXBElement<SecondaryHazardType> createSecondaryHazard(SecondaryHazardType value) {
        return new JAXBElement<SecondaryHazardType>(_SecondaryHazard_QNAME, SecondaryHazardType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DespatchLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DespatchLine")
    public JAXBElement<DespatchLineType> createDespatchLine(DespatchLineType value) {
        return new JAXBElement<DespatchLineType>(_DespatchLine_QNAME, DespatchLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LocationCoordinateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "LocationCoordinate")
    public JAXBElement<LocationCoordinateType> createLocationCoordinate(LocationCoordinateType value) {
        return new JAXBElement<LocationCoordinateType>(_LocationCoordinate_QNAME, LocationCoordinateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxSubTotalType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TaxSubTotal")
    public JAXBElement<TaxSubTotalType> createTaxSubTotal(TaxSubTotalType value) {
        return new JAXBElement<TaxSubTotalType>(_TaxSubTotal_QNAME, TaxSubTotalType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContactType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ShippingContact")
    public JAXBElement<ContactType> createShippingContact(ContactType value) {
        return new JAXBElement<ContactType>(_ShippingContact_QNAME, ContactType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PeriodType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TransitPeriod")
    public JAXBElement<PeriodType> createTransitPeriod(PeriodType value) {
        return new JAXBElement<PeriodType>(_TransitPeriod_QNAME, PeriodType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PeriodType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PenaltyPeriod")
    public JAXBElement<PeriodType> createPenaltyPeriod(PeriodType value) {
        return new JAXBElement<PeriodType>(_PenaltyPeriod_QNAME, PeriodType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "AddressLine")
    public JAXBElement<AddressLineType> createAddressLine(AddressLineType value) {
        return new JAXBElement<AddressLineType>(_AddressLine_QNAME, AddressLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "JurisdictionAddress")
    public JAXBElement<AddressType> createJurisdictionAddress(AddressType value) {
        return new JAXBElement<AddressType>(_JurisdictionAddress_QNAME, AddressType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Party")
    public JAXBElement<PartyType> createParty(PartyType value) {
        return new JAXBElement<PartyType>(_Party_QNAME, PartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "RegistrationAddress")
    public JAXBElement<AddressType> createRegistrationAddress(AddressType value) {
        return new JAXBElement<AddressType>(_RegistrationAddress_QNAME, AddressType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CommodityClassificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CommodityClassification")
    public JAXBElement<CommodityClassificationType> createCommodityClassification(CommodityClassificationType value) {
        return new JAXBElement<CommodityClassificationType>(_CommodityClassification_QNAME, CommodityClassificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link HazardousGoodsTransitType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "HazardousGoodsTransit")
    public JAXBElement<HazardousGoodsTransitType> createHazardousGoodsTransit(HazardousGoodsTransitType value) {
        return new JAXBElement<HazardousGoodsTransitType>(_HazardousGoodsTransit_QNAME, HazardousGoodsTransitType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ItemIdentification")
    public JAXBElement<ItemIdentificationType> createItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_ItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BasePriceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "BasePrice")
    public JAXBElement<BasePriceType> createBasePrice(BasePriceType value) {
        return new JAXBElement<BasePriceType>(_BasePrice_QNAME, BasePriceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link HazardousItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "HazardousItem")
    public JAXBElement<HazardousItemType> createHazardousItem(HazardousItemType value) {
        return new JAXBElement<HazardousItemType>(_HazardousItem_QNAME, HazardousItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BranchType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Branch")
    public JAXBElement<BranchType> createBranch(BranchType value) {
        return new JAXBElement<BranchType>(_Branch_QNAME, BranchType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DespatchAddress")
    public JAXBElement<AddressType> createDespatchAddress(AddressType value) {
        return new JAXBElement<AddressType>(_DespatchAddress_QNAME, AddressType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Address")
    public JAXBElement<AddressType> createAddress(AddressType value) {
        return new JAXBElement<AddressType>(_Address_QNAME, AddressType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ShipmentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Shipment")
    public JAXBElement<ShipmentType> createShipment(ShipmentType value) {
        return new JAXBElement<ShipmentType>(_Shipment_QNAME, ShipmentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Temperature")
    public JAXBElement<TemperatureType> createTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_Temperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "AdditionalItemIdentification")
    public JAXBElement<ItemIdentificationType> createAdditionalItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_AdditionalItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FinancialAccountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "FinancialAccount")
    public JAXBElement<FinancialAccountType> createFinancialAccount(FinancialAccountType value) {
        return new JAXBElement<FinancialAccountType>(_FinancialAccount_QNAME, FinancialAccountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TransportEquipmentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TransportEquipment")
    public JAXBElement<TransportEquipmentType> createTransportEquipment(TransportEquipmentType value) {
        return new JAXBElement<TransportEquipmentType>(_TransportEquipment_QNAME, TransportEquipmentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ShipmentStageType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ShipmentStage")
    public JAXBElement<ShipmentStageType> createShipmentStage(ShipmentStageType value) {
        return new JAXBElement<ShipmentStageType>(_ShipmentStage_QNAME, ShipmentStageType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BranchType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "FinancialInstitutionBranch")
    public JAXBElement<BranchType> createFinancialInstitutionBranch(BranchType value) {
        return new JAXBElement<BranchType>(_FinancialInstitutionBranch_QNAME, BranchType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FinancialAccountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PayeeFinancialAccount")
    public JAXBElement<FinancialAccountType> createPayeeFinancialAccount(FinancialAccountType value) {
        return new JAXBElement<FinancialAccountType>(_PayeeFinancialAccount_QNAME, FinancialAccountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SellerPartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SellerParty")
    public JAXBElement<SellerPartyType> createSellerParty(SellerPartyType value) {
        return new JAXBElement<SellerPartyType>(_SellerParty_QNAME, SellerPartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DespatchLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "HandlingUnitDespatchLine")
    public JAXBElement<DespatchLineType> createHandlingUnitDespatchLine(DespatchLineType value) {
        return new JAXBElement<DespatchLineType>(_HandlingUnitDespatchLine_QNAME, DespatchLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DestinationParty")
    public JAXBElement<PartyType> createDestinationParty(PartyType value) {
        return new JAXBElement<PartyType>(_DestinationParty_QNAME, PartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "BuyersItemIdentification")
    public JAXBElement<ItemIdentificationType> createBuyersItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_BuyersItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxTotalType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TaxTotal")
    public JAXBElement<TaxTotalType> createTaxTotal(TaxTotalType value) {
        return new JAXBElement<TaxTotalType>(_TaxTotal_QNAME, TaxTotalType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LegalTotalType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "LegalTotal")
    public JAXBElement<LegalTotalType> createLegalTotal(LegalTotalType value) {
        return new JAXBElement<LegalTotalType>(_LegalTotal_QNAME, LegalTotalType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InvoiceLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "InvoiceLine")
    public JAXBElement<InvoiceLineType> createInvoiceLine(InvoiceLineType value) {
        return new JAXBElement<InvoiceLineType>(_InvoiceLine_QNAME, InvoiceLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AddressType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DeliveryAddress")
    public JAXBElement<AddressType> createDeliveryAddress(AddressType value) {
        return new JAXBElement<AddressType>(_DeliveryAddress_QNAME, AddressType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TransportHandlingUnitType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TransportHandlingUnit")
    public JAXBElement<TransportHandlingUnitType> createTransportHandlingUnit(TransportHandlingUnitType value) {
        return new JAXBElement<TransportHandlingUnitType>(_TransportHandlingUnit_QNAME, TransportHandlingUnitType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link OrderedShipmentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderedShipment")
    public JAXBElement<OrderedShipmentType> createOrderedShipment(OrderedShipmentType value) {
        return new JAXBElement<OrderedShipmentType>(_OrderedShipment_QNAME, OrderedShipmentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "FlashpointTemperature")
    public JAXBElement<TemperatureType> createFlashpointTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_FlashpointTemperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContactType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "AccountsContact")
    public JAXBElement<ContactType> createAccountsContact(ContactType value) {
        return new JAXBElement<ContactType>(_AccountsContact_QNAME, ContactType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CountryType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OriginCountry")
    public JAXBElement<CountryType> createOriginCountry(CountryType value) {
        return new JAXBElement<CountryType>(_OriginCountry_QNAME, CountryType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "LineItem")
    public JAXBElement<LineItemType> createLineItem(LineItemType value) {
        return new JAXBElement<LineItemType>(_LineItem_QNAME, LineItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SellerSubstitutedLineItem")
    public JAXBElement<LineItemType> createSellerSubstitutedLineItem(LineItemType value) {
        return new JAXBElement<LineItemType>(_SellerSubstitutedLineItem_QNAME, LineItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CarrierParty")
    public JAXBElement<PartyType> createCarrierParty(PartyType value) {
        return new JAXBElement<PartyType>(_CarrierParty_QNAME, PartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CardAccountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CardAccount")
    public JAXBElement<CardAccountType> createCardAccount(CardAccountType value) {
        return new JAXBElement<CardAccountType>(_CardAccount_QNAME, CardAccountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DimensionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Dimension")
    public JAXBElement<DimensionType> createDimension(DimensionType value) {
        return new JAXBElement<DimensionType>(_Dimension_QNAME, DimensionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContactType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Contact")
    public JAXBElement<ContactType> createContact(ContactType value) {
        return new JAXBElement<ContactType>(_Contact_QNAME, ContactType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Item")
    public JAXBElement<ItemType> createItem(ItemType value) {
        return new JAXBElement<ItemType>(_Item_QNAME, ItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "BuyerProposedSubstituteLineItem")
    public JAXBElement<LineItemType> createBuyerProposedSubstituteLineItem(LineItemType value) {
        return new JAXBElement<LineItemType>(_BuyerProposedSubstituteLineItem_QNAME, LineItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PaymentMeansType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PaymentMeans")
    public JAXBElement<PaymentMeansType> createPaymentMeans(PaymentMeansType value) {
        return new JAXBElement<PaymentMeansType>(_PaymentMeans_QNAME, PaymentMeansType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PaymentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Payment")
    public JAXBElement<PaymentType> createPayment(PaymentType value) {
        return new JAXBElement<PaymentType>(_Payment_QNAME, PaymentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BuyerPartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "BuyerParty")
    public JAXBElement<BuyerPartyType> createBuyerParty(BuyerPartyType value) {
        return new JAXBElement<BuyerPartyType>(_BuyerParty_QNAME, BuyerPartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SellersItemIdentification")
    public JAXBElement<ItemIdentificationType> createSellersItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_SellersItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PaymentTermsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PaymentTerms")
    public JAXBElement<PaymentTermsType> createPaymentTerms(PaymentTermsType value) {
        return new JAXBElement<PaymentTermsType>(_PaymentTerms_QNAME, PaymentTermsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CountryType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Country")
    public JAXBElement<CountryType> createCountry(CountryType value) {
        return new JAXBElement<CountryType>(_Country_QNAME, CountryType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineItemType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SellerProposedSubstituteLineItem")
    public JAXBElement<LineItemType> createSellerProposedSubstituteLineItem(LineItemType value) {
        return new JAXBElement<LineItemType>(_SellerProposedSubstituteLineItem_QNAME, LineItemType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyTaxSchemeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PartyTaxScheme")
    public JAXBElement<PartyTaxSchemeType> createPartyTaxScheme(PartyTaxSchemeType value) {
        return new JAXBElement<PartyTaxSchemeType>(_PartyTaxScheme_QNAME, PartyTaxSchemeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "MinimumTemperature")
    public JAXBElement<TemperatureType> createMinimumTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_MinimumTemperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ReceiptLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ReceivedHandlingUnitReceiptLine")
    public JAXBElement<ReceiptLineType> createReceivedHandlingUnitReceiptLine(ReceiptLineType value) {
        return new JAXBElement<ReceiptLineType>(_ReceivedHandlingUnitReceiptLine_QNAME, ReceiptLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CreditAccountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CreditAccount")
    public JAXBElement<CreditAccountType> createCreditAccount(CreditAccountType value) {
        return new JAXBElement<CreditAccountType>(_CreditAccount_QNAME, CreditAccountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CatalogueItemIdentification")
    public JAXBElement<ItemIdentificationType> createCatalogueItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_CatalogueItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ManufacturersItemIdentification")
    public JAXBElement<ItemIdentificationType> createManufacturersItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_ManufacturersItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FinancialAccountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PayerFinancialAccount")
    public JAXBElement<FinancialAccountType> createPayerFinancialAccount(FinancialAccountType value) {
        return new JAXBElement<FinancialAccountType>(_PayerFinancialAccount_QNAME, FinancialAccountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PeriodType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Period")
    public JAXBElement<PeriodType> createPeriod(PeriodType value) {
        return new JAXBElement<PeriodType>(_Period_QNAME, PeriodType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LanguageType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Language")
    public JAXBElement<LanguageType> createLanguage(LanguageType value) {
        return new JAXBElement<LanguageType>(_Language_QNAME, LanguageType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeliveryTermsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DeliveryTerms")
    public JAXBElement<DeliveryTermsType> createDeliveryTerms(DeliveryTermsType value) {
        return new JAXBElement<DeliveryTermsType>(_DeliveryTerms_QNAME, DeliveryTermsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link OrderLineReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderLineReference")
    public JAXBElement<OrderLineReferenceType> createOrderLineReference(OrderLineReferenceType value) {
        return new JAXBElement<OrderLineReferenceType>(_OrderLineReference_QNAME, OrderLineReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContactType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderContact")
    public JAXBElement<ContactType> createOrderContact(ContactType value) {
        return new JAXBElement<ContactType>(_OrderContact_QNAME, ContactType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PhysicalAttributeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PhysicalAttribute")
    public JAXBElement<PhysicalAttributeType> createPhysicalAttribute(PhysicalAttributeType value) {
        return new JAXBElement<PhysicalAttributeType>(_PhysicalAttribute_QNAME, PhysicalAttributeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PeriodType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ValidityPeriod")
    public JAXBElement<PeriodType> createValidityPeriod(PeriodType value) {
        return new JAXBElement<PeriodType>(_ValidityPeriod_QNAME, PeriodType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PackageType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ContainedPackage")
    public JAXBElement<PackageType> createContainedPackage(PackageType value) {
        return new JAXBElement<PackageType>(_ContainedPackage_QNAME, PackageType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PartyName")
    public JAXBElement<PartyNameType> createPartyName(PartyNameType value) {
        return new JAXBElement<PartyNameType>(_PartyName_QNAME, PartyNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExchangeRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ExchangeRate")
    public JAXBElement<ExchangeRateType> createExchangeRate(ExchangeRateType value) {
        return new JAXBElement<ExchangeRateType>(_ExchangeRate_QNAME, ExchangeRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ReceiptLineReference")
    public JAXBElement<LineReferenceType> createReceiptLineReference(LineReferenceType value) {
        return new JAXBElement<LineReferenceType>(_ReceiptLineReference_QNAME, LineReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DocumentReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DocumentReference")
    public JAXBElement<DocumentReferenceType> createDocumentReference(DocumentReferenceType value) {
        return new JAXBElement<DocumentReferenceType>(_DocumentReference_QNAME, DocumentReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PackageType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ActualPackage")
    public JAXBElement<PackageType> createActualPackage(PackageType value) {
        return new JAXBElement<PackageType>(_ActualPackage_QNAME, PackageType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "AdditionalTemperature")
    public JAXBElement<TemperatureType> createAdditionalTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_AdditionalTemperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderedItemIdentification")
    public JAXBElement<ItemIdentificationType> createOrderedItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_OrderedItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ItemIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "StandardItemIdentification")
    public JAXBElement<ItemIdentificationType> createStandardItemIdentification(ItemIdentificationType value) {
        return new JAXBElement<ItemIdentificationType>(_StandardItemIdentification_QNAME, ItemIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DocumentReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "CatalogueDocumentReference")
    public JAXBElement<DocumentReferenceType> createCatalogueDocumentReference(DocumentReferenceType value) {
        return new JAXBElement<DocumentReferenceType>(_CatalogueDocumentReference_QNAME, DocumentReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxSchemeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TaxScheme")
    public JAXBElement<TaxSchemeType> createTaxScheme(TaxSchemeType value) {
        return new JAXBElement<TaxSchemeType>(_TaxScheme_QNAME, TaxSchemeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PackageType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Package")
    public JAXBElement<PackageType> createPackage(PackageType value) {
        return new JAXBElement<PackageType>(_Package_QNAME, PackageType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxCategoryType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TaxCategory")
    public JAXBElement<TaxCategoryType> createTaxCategory(TaxCategoryType value) {
        return new JAXBElement<TaxCategoryType>(_TaxCategory_QNAME, TaxCategoryType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "DespatchLineReference")
    public JAXBElement<LineReferenceType> createDespatchLineReference(LineReferenceType value) {
        return new JAXBElement<LineReferenceType>(_DespatchLineReference_QNAME, LineReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyIdentificationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "PartyIdentification")
    public JAXBElement<PartyIdentificationType> createPartyIdentification(PartyIdentificationType value) {
        return new JAXBElement<PartyIdentificationType>(_PartyIdentification_QNAME, PartyIdentificationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContractType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ForeignExchangeContract")
    public JAXBElement<ContractType> createForeignExchangeContract(ContractType value) {
        return new JAXBElement<ContractType>(_ForeignExchangeContract_QNAME, ContractType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CommunicationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OtherCommunication")
    public JAXBElement<CommunicationType> createOtherCommunication(CommunicationType value) {
        return new JAXBElement<CommunicationType>(_OtherCommunication_QNAME, CommunicationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PeriodType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "SettlementPeriod")
    public JAXBElement<PeriodType> createSettlementPeriod(PeriodType value) {
        return new JAXBElement<PeriodType>(_SettlementPeriod_QNAME, PeriodType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link OrderReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderReference")
    public JAXBElement<OrderReferenceType> createOrderReference(OrderReferenceType value) {
        return new JAXBElement<OrderReferenceType>(_OrderReference_QNAME, OrderReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "IssuerParty")
    public JAXBElement<PartyType> createIssuerParty(PartyType value) {
        return new JAXBElement<PartyType>(_IssuerParty_QNAME, PartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AllowanceChargeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "AllowanceCharge")
    public JAXBElement<AllowanceChargeType> createAllowanceCharge(AllowanceChargeType value) {
        return new JAXBElement<AllowanceChargeType>(_AllowanceCharge_QNAME, AllowanceChargeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FinancialInstitutionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "FinancialInstitution")
    public JAXBElement<FinancialInstitutionType> createFinancialInstitution(FinancialInstitutionType value) {
        return new JAXBElement<FinancialInstitutionType>(_FinancialInstitution_QNAME, FinancialInstitutionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TemperatureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "EmergencyTemperature")
    public JAXBElement<TemperatureType> createEmergencyTemperature(TemperatureType value) {
        return new JAXBElement<TemperatureType>(_EmergencyTemperature_QNAME, TemperatureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContractType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Contract")
    public JAXBElement<ContractType> createContract(ContractType value) {
        return new JAXBElement<ContractType>(_Contract_QNAME, ContractType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PartyType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "ContactParty")
    public JAXBElement<PartyType> createContactParty(PartyType value) {
        return new JAXBElement<PartyType>(_ContactParty_QNAME, PartyType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineReferenceType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "LineReference")
    public JAXBElement<LineReferenceType> createLineReference(LineReferenceType value) {
        return new JAXBElement<LineReferenceType>(_LineReference_QNAME, LineReferenceType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link OrderLineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "OrderLine")
    public JAXBElement<OrderLineType> createOrderLine(OrderLineType value) {
        return new JAXBElement<OrderLineType>(_OrderLine_QNAME, OrderLineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ContractType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "TransportContract")
    public JAXBElement<ContractType> createTransportContract(ContractType value) {
        return new JAXBElement<ContractType>(_TransportContract_QNAME, ContractType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeliveryType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0", name = "Delivery")
    public JAXBElement<DeliveryType> createDelivery(DeliveryType value) {
        return new JAXBElement<DeliveryType>(_Delivery_QNAME, DeliveryType.class, null, value);
    }

}
