    Internet Engineering Task Force (IETF)                          C. Daboo
    Request for Comments: 6321                                   Apple, Inc.
    Category: Standards Track                                    M. Douglass
    ISSN: 2070-1721                                                      RPI
                                                                     S. Lees
                                                                   Microsoft
                                                                 August 2011

                       xCal: The XML Format for iCalendar

    Abstract

       This specification defines "xCal", an XML format for iCalendar data.

    Status of This Memo

       This is an Internet Standards Track document.

       This document is a product of the Internet Engineering Task Force
       (IETF).  It represents the consensus of the IETF community.  It has
       received public review and has been approved for publication by the
       Internet Engineering Steering Group (IESG).  Further information on
       Internet Standards is available in Section 2 of RFC 5741.

       Information about the current status of this document, any errata,
       and how to provide feedback on it may be obtained at
       http://www.rfc-editor.org/info/rfc6321.

    Copyright Notice

       Copyright (c) 2011 IETF Trust and the persons identified as the
       document authors.  All rights reserved.

       This document is subject to BCP 78 and the IETF Trust's Legal
       Provisions Relating to IETF Documents
       (http://trustee.ietf.org/license-info) in effect on the date of
       publication of this document.  Please review these documents
       carefully, as they describe your rights and restrictions with respect
       to this document.  Code Components extracted from this document must
       include Simplified BSD License text as described in Section 4.e of
       the Trust Legal Provisions and are provided without warranty as
       described in the Simplified BSD License.

    Daboo, et al.                Standards Track                    [Page 1]

    RFC 6321                          xCal                       August 2011

    Table of Contents

       1. Introduction ....................................................3
       2. Conventions Used in This Document ...............................4
       3. Converting from iCalendar to xCal ...............................4
          3.1. Pre-Processing .............................................4
          3.2. iCalendar Stream (RFC 5545, Section 3.4) ...................5
          3.3. Components (RFC 5545, Section 3.6) .........................6
          3.4. Properties (RFC 5545, Sections 3.7 and 3.8) ................6
               3.4.1. Special Cases for Properties ........................8
                      3.4.1.1. Multi-Valued Properties ....................8
                      3.4.1.2. GEO Property ...............................9
                      3.4.1.3. REQUEST-STATUS Property ....................9
          3.5. Parameters (RFC 5545, Section 3.2) ........................10
               3.5.1. VALUE Parameter ....................................11
          3.6. Values (RFC 5545, Section 3.3) ............................11
               3.6.1. Binary (RFC 5545, Section 3.3.1) ...................12
               3.6.2. Boolean  (RFC 5545, Section 3.3.2) .................12
               3.6.3. Calendar User Address (RFC 5545, Section 3.3.3) ....12
               3.6.4. Date (RFC 5545, Section 3.3.4) .....................12
               3.6.5. Date-Time (RFC 5545, Section 3.3.5) ................13
               3.6.6. Duration (RFC 5545, Section 3.3.6) .................13
               3.6.7. Float (RFC 5545, Section 3.3.7) ....................13
               3.6.8. Integer (RFC 5545, Section 3.3.8) ..................14
               3.6.9. Period of Time (RFC 5545, Section 3.3.9) ...........14
               3.6.10. Recurrence Rule (RFC 5545, Section 3.3.10) ........14
               3.6.11. Text (RFC 5545, Section 3.3.11) ...................15
               3.6.12. Time (RFC 5545, Section 3.3.12) ...................15
               3.6.13. URI (RFC 5545, Section 3.3.13) ....................15
               3.6.14. UTC Offset (RFC 5545, Section 3.3.14) .............16
          3.7. Extensions ................................................16
       4. Converting from xCal into iCalendar ............................16
          4.1. Converting XML Extensions into iCalendar ..................16
          4.2. The XML Property for iCalendar ............................17
       5. Handling Unrecognized Properties or Parameters .................18
       6. Security Considerations ........................................19
       7. IANA Considerations ............................................20
          7.1. Namespace Registration ....................................20
          7.2. Media Type ................................................20
          7.3. iCalendar Property Registrations ..........................21
       8. Acknowledgments ................................................22
       9. References .....................................................22
          9.1. Normative References ......................................22
          9.2. Informative References ....................................22

    Daboo, et al.                Standards Track                    [Page 2]

    RFC 6321                          xCal                       August 2011

       Appendix A. RELAX NG Schema .......................................23
       Appendix B. Examples ..............................................49
         B.1. Example 1 ..................................................49
           B.1.1. iCalendar Data .........................................49
           B.1.2. XML Data ...............................................49
         B.2. Example 2 ..................................................50
           B.2.1. iCalendar Data .........................................50
           B.2.2. XML Data ...............................................51

    1.  Introduction

       The iCalendar data format [RFC5545] is a widely deployed interchange
       format for calendaring and scheduling data.  While many applications
       and services consume and generate calendar data, iCalendar is a
       specialized format that requires its own parser/generator.  In
       contrast, XML-based formats are widely used for interoperability
       between applications, and the many tools that generate, parse, and
       manipulate XML make it easier to work with than iCalendar.

       The purpose of this specification is to define "xCal", an XML format
       for iCalendar data. xCal is defined as a straightforward mapping into
       XML from iCalendar, so that iCalendar data can be converted to XML,
       and then back to iCalendar, without losing any semantic meaning in
       the data.  Anyone creating xCal calendar data according to this
       specification will know that their data can be converted to a valid
       iCalendar representation as well.

       Key design considerations are:

          Round-tripping (converting an iCalendar instance to xCal and back)
          will give the same semantic result as the starting point.  That
          is, all components, properties, and property parameters are
          guaranteed to be preserved, with the exception of those that have
          default values.

          xCal preserves the semantics of the iCalendar data.  While a
          simple consumer can easily browse the calendar data in xCal, a
          full understanding of iCalendar is still required in order to
          modify and/or fully comprehend the calendar data.

          xCal has the ability to handle many extensions to the underlying
          iCalendar specification without requiring an update to this
          document.

    Daboo, et al.                Standards Track                    [Page 3]

    RFC 6321                          xCal                       August 2011

    2.  Conventions Used in This Document

       The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
       "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
       document are to be interpreted as described in [RFC2119].

       When XML element types in the namespace
       "urn:ietf:params:xml:ns:icalendar-2.0" are referenced in this
       document outside of the context of an XML fragment, the string "IC:"
       will be prefixed to the element types.

       Some examples in this document contain "partial" XML documents used
       for illustrative purposes.  In these examples, three periods "..."
       are used to indicate a portion of the document that has been removed
       for compactness.

    3.  Converting from iCalendar to xCal

       This section describes how iCalendar data is converted to xCal using
       a simple mapping between the iCalendar data model and XML elements.

    3.1.  Pre-Processing

       iCalendar uses a line folding mechanism to limit lines of data to a
       maximum line length (typically 72 characters) to ensure maximum
       likelihood of preserving data integrity as it is transported via
       various means (e.g., email) -- see Section 3.1 of [RFC5545].  Prior
       to converting iCalendar data into xCal, all folded lines MUST be
       unfolded.

       iCalendar data uses an "escape" character sequence for text values
       and property parameter values.  When such text elements are converted
       into xCal, the escaping MUST be removed.

       iCalendar uses a base64 encoding for binary data.  However, it does
       not restrict the encoding from being applied to non-binary value
       types.  So, the following rules MUST be applied when processing a
       property with the "ENCODING" property parameter set to "BASE64":

       o  If the property value type is "BINARY", the base64 encoding MUST
          be preserved.

       o  If the value type is not "BINARY", the "ENCODING" property
          parameter MUST be removed, and the value MUST be base64 decoded.

       When base64 encoding and decoding are used, they MUST conform to
       Section 4 of [RFC4648], which is the base64 method used in [RFC5545].

    Daboo, et al.                Standards Track                    [Page 4]

    RFC 6321                          xCal                       August 2011

       One key difference in the formatting of values used in iCalendar and
       xCal is that, in xCal, the specification uses date/time and UTC
       offset values aligned with the syntax of
       [W3C.REC-xmlschema-2-20041028] to aid with XML processing.

    3.2.  iCalendar Stream (RFC 5545, Section 3.4)

       At the top level of the iCalendar object model is an "iCalendar
       stream".  This object encompasses multiple "iCalendar objects".  In
       xCal, the entire stream is contained in the root IC:icalendar XML
       element.

       An iCalendar stream can contain one or more iCalendar objects.  Each
       iCalendar object, delimited by "BEGIN:VCALENDAR" and "END:VCALENDAR",
       is enclosed by the IC:vcalendar XML element.

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         <vcalendar>
         ...
         </vcalendar>
       </icalendar>

       iCalendar objects are comprised of a set of "components",
       "properties", "parameters", and "values".  A "component" can contain
       other "components" or "properties".  A "property" has a value and a
       set of zero or more "parameters".

       In xCal, component elements, for example, IC:vevent and IC:vtodo, are
       contained within an IC:components XML element.  Within the component
       element, another IC:components element could appear (representing
       components nested within components) or the IC:properties XML element
       could appear.  IC:properties is used to encapsulate iCalendar
       properties.

       Each iCalendar property will be mapped to its own XML element as
       described below.  Within each of these elements, there is zero or one
       IC:parameters XML element used to encapsulate any iCalendar property
       parameters.  Additionally there will be one or more XML elements
       representing the value of the iCalendar property.

    Daboo, et al.                Standards Track                    [Page 5]

    RFC 6321                          xCal                       August 2011

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         <vcalendar>
           <properties>
           ...
           </properties>
           <components>
           ...
           </components>
         </vcalendar>
       </icalendar>

              +------------------+--------------+------------------+
              | Item             | XML element  | XML Definition   |
              +------------------+--------------+------------------+
              | iCalendar Stream | IC:icalendar | Appendix A # 3.4 |
              | VCALENDAR        | IC:vcalendar | Appendix A # 3.6 |
              +------------------+--------------+------------------+

    3.3.  Components (RFC 5545, Section 3.6)

       Each calendar component in the "VCALENDAR" object, delimited by
       "BEGIN" and "END", will be converted to an enclosing XML element with
       the same name, but in lowercase.  As an example, the table below
       shows iCalendar-to-xCal mappings for current iCalendar components.
       Any new iCalendar components added in the future will be converted in
       the same way.

                 +-----------+--------------+--------------------+
                 | Component | XML element  | XML Definition     |
                 +-----------+--------------+--------------------+
                 | VEVENT    | IC:vevent    | Appendix A # 3.6.1 |
                 | VTODO     | IC:vtodo     | Appendix A # 3.6.2 |
                 | VJOURNAL  | IC:vjournal  | Appendix A # 3.6.3 |
                 | VFREEBUSY | IC:vfreebusy | Appendix A # 3.6.4 |
                 | VTIMEZONE | IC:vtimezone | Appendix A # 3.6.5 |
                 | STANDARD  | IC:standard  | Appendix A # 3.6.5 |
                 | DAYLIGHT  | IC:daylight  | Appendix A # 3.6.5 |
                 | VALARM    | IC:valarm    | Appendix A # 3.6.6 |
                 +-----------+--------------+--------------------+

    3.4.  Properties (RFC 5545, Sections 3.7 and 3.8)

       iCalendar properties, whether they apply to the "VCALENDAR" object or
       to a component, are handled in a consistent way in the xCal format.

    Daboo, et al.                Standards Track                    [Page 6]

    RFC 6321                          xCal                       August 2011

       iCalendar properties are enclosed in the XML element IC:properties.

       Each individual iCalendar property is represented in xCal by an
       element of the same name as the iCalendar property, but in lowercase.
       For example, the "CALSCALE" property is represented in xCal by the
       IC:calscale element.

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         <vcalendar>
           <properties>
             <calscale>...</calscale>
             <version>...</version>
             <prodid>...</prodid>
           </properties>
           <components>
           ...
           </components>
         </vcalendar>
       </icalendar>

       Each property can contain an IC:parameters XML element encapsulating
       any iCalendar property parameters associated with the iCalendar
       property.

       Each property will contain one or more "value" XML elements as
       described below representing the value of the iCalendar property.

       As an example, the table below shows iCalendar-to-xCal mappings for
       current iCalendar properties.  Any new iCalendar properties added in
       the future will be converted in the same way.

        +------------------+---------------------+-----------------------+
        | Property         | XML element         | XML Definition        |
        +------------------+---------------------+-----------------------+
        | CALSCALE         | IC:calscale         | Appendix A # 3.7.1    |
        | METHOD           | IC:method           | Appendix A # 3.7.2    |
        | PRODID           | IC:prodid           | Appendix A # 3.7.3    |
        | VERSION          | IC:version          | Appendix A # 3.7.4    |
        | ATTACH           | IC:attach           | Appendix A # 3.8.1.1  |
        | CATEGORIES       | IC:categories       | Appendix A # 3.8.1.2  |
        | CLASS            | IC:class            | Appendix A # 3.8.1.3  |
        | COMMENT          | IC:comment          | Appendix A # 3.8.1.4  |
        | DESCRIPTION      | IC:description      | Appendix A # 3.8.1.5  |
        | GEO              | IC:geo              | Appendix A # 3.8.1.6  |
        | LOCATION         | IC:location         | Appendix A # 3.8.1.7  |

    Daboo, et al.                Standards Track                    [Page 7]

    RFC 6321                          xCal                       August 2011

        | PERCENT-COMPLETE | IC:percent-complete | Appendix A # 3.8.1.8  |
        | PRIORITY         | IC:priority         | Appendix A # 3.8.1.9  |
        | RESOURCES        | IC:resources        | Appendix A # 3.8.1.10 |
        | STATUS           | IC:status           | Appendix A # 3.8.1.11 |
        | SUMMARY          | IC:summary          | Appendix A # 3.8.1.12 |
        | COMPLETED        | IC:completed        | Appendix A # 3.8.2.1  |
        | DTEND            | IC:dtend            | Appendix A # 3.8.2.2  |
        | DUE              | IC:due              | Appendix A # 3.8.2.3  |
        | DTSTART          | IC:dtstart          | Appendix A # 3.8.2.4  |
        | DURATION         | IC:duration         | Appendix A # 3.8.2.5  |
        | FREEBUSY         | IC:freebusy         | Appendix A # 3.8.2.6  |
        | TRANSP           | IC:transp           | Appendix A # 3.8.2.7  |
        | TZID             | IC:tzid             | Appendix A # 3.8.3.1  |
        | TZNAME           | IC:tzname           | Appendix A # 3.8.3.2  |
        | TZOFFSETFROM     | IC:tzoffsetfrom     | Appendix A # 3.8.3.3  |
        | TZOFFSETTO       | IC:tzoffsetto       | Appendix A # 3.8.3.4  |
        | TZURL            | IC:tzurl            | Appendix A # 3.8.3.5  |
        | ATTENDEE         | IC:attendee         | Appendix A # 3.8.4.1  |
        | CONTACT          | IC:contact          | Appendix A # 3.8.4.2  |
        | ORGANIZER        | IC:organizer        | Appendix A # 3.8.4.3  |
        | RECURRENCE-ID    | IC:recurrence-id    | Appendix A # 3.8.4.4  |
        | RELATED-TO       | IC:related-to       | Appendix A # 3.8.4.5  |
        | URL              | IC:url              | Appendix A # 3.8.4.6  |
        | UID              | IC:uid              | Appendix A # 3.8.4.7  |
        | EXDATE           | IC:exdate           | Appendix A # 3.8.5.1  |
        | RDATE            | IC:rdate            | Appendix A # 3.8.5.2  |
        | RRULE            | IC:rrule            | Appendix A # 3.8.5.3  |
        | ACTION           | IC:action           | Appendix A # 3.8.6.1  |
        | REPEAT           | IC:repeat           | Appendix A # 3.8.6.2  |
        | TRIGGER          | IC:trigger          | Appendix A # 3.8.6.3  |
        | CREATED          | IC:created          | Appendix A # 3.8.7.1  |
        | DTSTAMP          | IC:dtstamp          | Appendix A # 3.8.7.2  |
        | LAST-MODIFIED    | IC:last-modified    | Appendix A # 3.8.7.3  |
        | SEQUENCE         | IC:sequence         | Appendix A # 3.8.7.4  |
        | REQUEST-STATUS   | IC:request-status   | Appendix A # 3.8.8.3  |
        +------------------+---------------------+-----------------------+

    3.4.1.  Special Cases for Properties

       This section describes some properties that have special handling
       when converting to xCal.

    3.4.1.1.  Multi-Valued Properties

       The following iCalendar properties can have values that consist of a
       list of "standard" iCalendar values separated by a specific
       delimiter.  In xCal, these properties are represented by an XML
       element that contains multiple "value" elements (Section 3.6).

    Daboo, et al.                Standards Track                    [Page 8]

    RFC 6321                          xCal                       August 2011

              +------------+---------------+-----------------------+
              | Property   | XML element   | XML Definition        |
              +------------+---------------+-----------------------+
              | CATEGORIES | IC:categories | Appendix A # 3.8.1.2  |
              | RESOURCES  | IC:resources  | Appendix A # 3.8.1.10 |
              | FREEBUSY   | IC:freebusy   | Appendix A # 3.8.2.6  |
              | EXDATE     | IC:exdate     | Appendix A # 3.8.5.1  |
              | RDATE      | IC:rdate      | Appendix A # 3.8.5.2  |
              +------------+---------------+-----------------------+

    3.4.1.2.  GEO Property

       In iCalendar, the "GEO" property value is defined as a semicolon-
       separated list of two "FLOAT" values; the first representing latitude
       and the second longitude.

       In xCal, the value for the IC:geo element is represented by two XML
       elements.  These are an IC:latitude element and an IC:longitude
       element, each of which contains float values.  See Appendix A #
       3.8.1.6.

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         ...
         <geo>
           <latitude>37.386013</latitude>
           <longitude>-122.082932</longitude>
         </geo>
         ...
       </icalendar>

    3.4.1.3.  REQUEST-STATUS Property

       In iCalendar, the "REQUEST-STATUS" property value is defined as a
       semicolon-separated list of two or three "TEXT" values.  The first
       represents a code, the second a description, and the third any
       additional data.

       In xCal, the value for the IC:request-status element is represented
       by two or three XML elements.  These are an IC:code element, an IC:
       description element, and an IC:data element, each of which contains
       the corresponding "TEXT" values.  If there is no additional data in
       the iCalendar value, the IC:data element (which would be empty)
       SHOULD NOT be present.  See Appendix A # 3.8.8.3.

    Daboo, et al.                Standards Track                    [Page 9]

    RFC 6321                          xCal                       August 2011

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         ...
         <request-status>
           <code>2.0</code>
           <description>Success</description>
         </request-status>
         ...
       </icalendar>

    3.5.  Parameters (RFC 5545, Section 3.2)

       iCalendar property parameters are enclosed in the XML element IC:
       parameters, which occurs in each property XML element.  If there are
       no iCalendar property parameters, the IC:parameters element (which
       would be empty) SHOULD NOT be present.

       Each individual iCalendar property parameter is represented in xCal
       by an element of the same name as the iCalendar property parameter,
       but in lowercase.  For example, the "PARTSTAT" property parameter is
       represented in xCal by the IC:partstat element.

       Example:

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         <vcalendar>
           ...
           <components>
             ...
             <attendee>
               <parameters>
                 <partstat><text>NEEDS-ACTION</text></partstat>
               </parameters>
               ...
             </attendee>
             ...
           </components>
         </vcalendar>
       </icalendar>

       Each XML parameter element contains one or more child XML elements
       representing iCalendar value types.

    Daboo, et al.                Standards Track                   [Page 10]

    RFC 6321                          xCal                       August 2011

       As an example, the table below shows iCalendar-to-xCal mappings for
       current iCalendar parameters.  Any new iCalendar parameters added in
       the future will be converted in the same way.

           +----------------+-------------------+---------------------+
           | Parameter      | XML element       | XML Definition      |
           +----------------+-------------------+---------------------+
           | ALTREP         | IC:altrep         | Appendix A # 3.2.1  |
           | CN             | IC:cn             | Appendix A # 3.2.2  |
           | CUTYPE         | IC:cutype         | Appendix A # 3.2.3  |
           | DELEGATED-FROM | IC:delegated-from | Appendix A # 3.2.4  |
           | DELEGATED-TO   | IC:delegated-to   | Appendix A # 3.2.5  |
           | DIR            | IC:dir            | Appendix A # 3.2.6  |
           | ENCODING       | IC:encoding       | Appendix A # 3.2.7  |
           | FMTTYPE        | IC:fmttype        | Appendix A # 3.2.8  |
           | FBTYPE         | IC:fbtype         | Appendix A # 3.2.9  |
           | LANGUAGE       | IC:language       | Appendix A # 3.2.10 |
           | MEMBER         | IC:member         | Appendix A # 3.2.11 |
           | PARTSTAT       | IC:partstat       | Appendix A # 3.2.12 |
           | RANGE          | IC:range          | Appendix A # 3.2.13 |
           | RELATED        | IC:related        | Appendix A # 3.2.14 |
           | RELTYPE        | IC:reltype        | Appendix A # 3.2.15 |
           | ROLE           | IC:role           | Appendix A # 3.2.16 |
           | RSVP           | IC:rsvp           | Appendix A # 3.2.17 |
           | SENT-BY        | IC:sent-by        | Appendix A # 3.2.18 |
           | TZID           | IC:tzid           | Appendix A # 3.2.19 |
           +----------------+-------------------+---------------------+

    3.5.1.  VALUE Parameter

       iCalendar defines a "VALUE" property parameter (Section 3.2.20 of
       [RFC5545]).  This property parameter is not mapped to an xCal XML
       element.  Instead, the value type is handled by having different XML
       elements for each value, and these appear inside of property
       elements.  Thus, when converting from iCalendar to xCal, any "VALUE"
       property parameters are skipped.  When converting from xCal into
       iCalendar, the appropriate "VALUE" property parameter MUST be
       included in the iCalendar property if the value type is not the
       default value type for that property.

    3.6.  Values (RFC 5545, Section 3.3)

       In the typical case, iCalendar value types are mapped into XML
       elements with a matching name in all lowercase.  In the case of the
       value for a recurrence rule (see below), iCalendar defines
       "structured" values, and these are mapped into separate child
       elements for each value element.

    Daboo, et al.                Standards Track                   [Page 11]

    RFC 6321                          xCal                       August 2011

    3.6.1.  Binary (RFC 5545, Section 3.3.1)

       Description:  iCalendar "BINARY" property values are represented by
          the IC:binary XML element.  The content of the element is base64
          encoded data, conforming to Section 4 of [RFC4648], which is the
          base64 method used in [RFC5545].  Whitespace MAY be inserted into
          the data at any point to "wrap" the data to reasonable line
          lengths.  When converting back to iCalendar, the whitespace MUST
          first be removed.

       XML Definition:  Appendix A # 3.3.1

       Example:

       <binary>SGVsbG8gV29ybGQh</binary>

    3.6.2.  Boolean  (RFC 5545, Section 3.3.2)

       Description:  iCalendar "BOOLEAN" property values are represented by
          the IC:boolean XML element.  The content of the element is a
          boolean value.

       XML Definition:  Appendix A # 3.3.2

       Example:

       <boolean>true</boolean>

    3.6.3.  Calendar User Address (RFC 5545, Section 3.3.3)

       Description:  iCalendar "CAL-ADDRESS" property values are represented
          by the IC:cal-address XML element.  The content of the element is
          a URI.

       XML Definition:  Appendix A # 3.3.3

       Example:

       <cal-address>mailto:cyrus@example.com</cal-address>

    3.6.4.  Date (RFC 5545, Section 3.3.4)

       Description:  iCalendar "DATE" property values are represented by the
          IC:date XML element.  The content of the element is the same date
          value specified by [RFC5545], with the exception that the date
          components are separated by "-" characters, for consistency with
          [W3C.REC-xmlschema-2-20041028].

    Daboo, et al.                Standards Track                   [Page 12]

    RFC 6321                          xCal                       August 2011

       XML Definition:  Appendix A # 3.3.4

       Example:

       <date>2011-05-17</date>

    3.6.5.  Date-Time (RFC 5545, Section 3.3.5)

       Description:  iCalendar "DATE-TIME" property values are represented
          by the IC:date-time XML element.  The content of the element is
          the same date-time value specified by [RFC5545], with the
          exception that the date components are separated by "-"
          characters, and the time components are separated by ":"
          characters, for consistency with [W3C.REC-xmlschema-2-20041028].
          Note that while [W3C.REC-xmlschema-2-20041028] allows for a UTC
          offset to be included in date/time values, xCal does not use that,
          and instead follows the iCalendar behavior of using time zone
          definitions via the "TZID" property parameter.

       XML Definition:  Appendix A # 3.3.5

       Example:

       <date-time>2011-05-17T12:00:00</date-time>

    3.6.6.  Duration (RFC 5545, Section 3.3.6)

       Description:  iCalendar "DURATION" property values are represented by
          the IC:duration XML element.  The content of the element is the
          same duration value specified by [RFC5545].

       XML Definition:  Appendix A # 3.3.6

       Example:

       <duration>P1D</duration>

    3.6.7.  Float (RFC 5545, Section 3.3.7)

       Description:  iCalendar "FLOAT" property values are represented by
          the IC:float XML element.  The content of the element is a text
          representation of a floating point number.

       XML Definition:  Appendix A # 3.3.7

       Example:

       <float>0.5</float>

    Daboo, et al.                Standards Track                   [Page 13]

    RFC 6321                          xCal                       August 2011

    3.6.8.  Integer (RFC 5545, Section 3.3.8)

       Description:  iCalendar "INTEGER" property values are represented by
          the IC:integer XML element.  The content of the element is a text
          representation of an integer number.

       XML Definition:  Appendix A # 3.3.8

       Examples:

       <integer>50</integer>
       <integer>-100</integer>

    3.6.9.  Period of Time (RFC 5545, Section 3.3.9)

       Description:  iCalendar "PERIOD" property values are represented by
          the IC:period XML element.  The content of the element is child
          elements representing the start, end, or duration components of
          the period.

       XML Definition:  Appendix A # 3.3.9

       Example:

       <period>
         <start>2011-05-17T12:00:00</start>
         <duration>P1H</duration>
       </period>

    3.6.10.  Recurrence Rule (RFC 5545, Section 3.3.10)

       Description:  iCalendar "RECUR" property values are represented by
          the IC:recur XML element.  The content of the element is child
          elements representing the various components of a recurrence rule.

       XML Definition:  Appendix A # 3.3.10

       Example:

       <recur>
         <freq>YEARLY</freq>
         <count>5</count>
         <byday>-1SU</byday>
         <bymonth>10</bymonth>
       </recur>

    Daboo, et al.                Standards Track                   [Page 14]

    RFC 6321                          xCal                       August 2011

    3.6.11.  Text (RFC 5545, Section 3.3.11)

       Description:  iCalendar "TEXT" property values are represented by the
          IC:text XML element.  The content of the element is simple text.

       XML Definition:  Appendix A # 3.3.11

       Example:

       <text>Hello World!</text>

    3.6.12.  Time (RFC 5545, Section 3.3.12)

       Description:  iCalendar "TIME" property values are represented by the
          IC:time XML element.  The content of the element is the same time
          value specified by [RFC5545], with the exception that the time
          components are separated by ":" characters, for consistency with
          [W3C.REC-xmlschema-2-20041028].  Note that while
          [W3C.REC-xmlschema-2-20041028] allows for a UTC offset to be
          included in date/time values, xCal does not use that, and instead
          follows the iCalendar behavior of using time zone definitions via
          the "TZID" property parameter.

       XML Definition:  Appendix A # 3.3.12

       Example:

       <time>12:00:00</time>

    3.6.13.  URI (RFC 5545, Section 3.3.13)

       Description:  iCalendar "URI" property values are represented by the
          IC:uri XML element.  The content of the element is a URI.

       XML Definition:  Appendix A # 3.3.13

       Example:

       <uri>http://calendar.example.com</uri>

    Daboo, et al.                Standards Track                   [Page 15]

    RFC 6321                          xCal                       August 2011

    3.6.14.  UTC Offset (RFC 5545, Section 3.3.14)

       Description:  iCalendar "UTC-OFFSET" property values are represented
          by the IC:utc-offset XML element.  The content of the element is
          the same UTC offset value specified by [RFC5545], with the
          exception that the hour, minute, and second components are
          separated by a ":" character, for consistency with
          [W3C.REC-xmlschema-2-20041028].

       XML Definition:  Appendix A # 3.3.14

       Example:

       <utc-offset>-05:00</utc-offset>

    3.7.  Extensions

       iCalendar extension properties and property parameters (those with an
       "X-" prefix in their name) are handled in the same way as other
       properties and property parameters: the property or property
       parameter is represented by an XML element with the same name, but in
       lowercase, e.g., the "X-FOO" property in iCalendar turns into the IC:
       x-foo element in xCal.  However, see Section 5 for how to deal with
       default values for unrecognized extension properties or property
       parameters.

    4.  Converting from xCal into iCalendar

       When converting component, property, and property parameter values,
       the names SHOULD be converted to uppercase.  Although iCalendar names
       are case insensitive, common practice is to keep them all uppercase
       following the actual definitions in [RFC5545].

       BACKSLASH character encoding and line folding MUST be applied to the
       resulting iCalendar data as required by [RFC5545].

       Non-binary value types MUST NOT be base64 encoded.

    4.1.  Converting XML Extensions into iCalendar

       XML extensions are converted back to iCalendar in one of two ways,
       depending on whether the extensions are in the iCalendar XML
       namespace or in an external namespace.

       Extensions that are part of the iCalendar XML namespace MUST have
       element names that begin with "x-", and will be converted back to the
       equivalent extension property in iCalendar.  For example, the "x-foo"
       element will convert to the "X-FOO" iCalendar property.

    Daboo, et al.                Standards Track                   [Page 16]

    RFC 6321                          xCal                       August 2011

       Extensions that are in a namespace other than the iCalendar XML
       namespace SHOULD be preserved in the iCalendar representation using
       the "XML" iCalendar property described in Section 4.2.  Only those
       extension elements that are immediate child elements of the IC:
       properties element are converted, any others are ignored.

    4.2.  The XML Property for iCalendar

       This section describes an extension property for iCalendar, as
       covered in Section 8.2.3 of [RFC5545].

       Property name: XML

       Purpose: To embed extended XML-encoded iCalendar data in the
       iCalendar format.

       Value type: The default value type is "TEXT".  The value type can
       also be set to "BINARY" to indicate base64 encoded content.

       Property parameters: IANA, non-standard, inline encoding, and value
       data type property parameters can be specified on this property.

       Conformance: The property can be specified multiple times in any
       calendar component.

       Description: The value of this property is a single XML 1.0
       [W3C.REC-xml-20081126] element.  The "XML" property MUST NOT be used
       to contain properties that are already defined in iCalendar.  Since
       all elements in the urn:ietf:params:xml:ns:icalendar-2.0 namespace
       convert to a well-defined iCalendar object, the elements in this
       property MUST NOT be in the urn:ietf:params:xml:ns:icalendar-2.0
       namespace.  The XML element that is the value of this property MUST
       have an XML namespace declaration.

       The default value type for this property is "TEXT", and normal
       BACKSLASH character encoding rules for that value MUST be applied.
       Note that the source XML can contain characters not allowed in "TEXT"
       property values.  If this is the case, then the XML data MUST be
       base64 encoded.  As required by [RFC5545], the "ENCODING" property
       parameter MUST be present and set to "BASE64", and the "VALUE"
       property parameter MUST be present and set to "BINARY".

       The ordering of "XML" properties is not preserved in the conversion
       between xCal and iCalendar.

       Format definition: This property is defined by the following
       notation:

    Daboo, et al.                Standards Track                   [Page 17]

    RFC 6321                          xCal                       August 2011

       xml      = "XML" xmlparam ( ":" text ) /
                    (
                      ";" "ENCODING" "=" "BASE64"
                      ";" "VALUE" "=" "BINARY"
                      ":" binary
                    )
                    CRLF

       xmlparam     = *(";" other-param)

       Example: The following is an example of a location embedded in KML
       markup inside the "XML" property.

       XML:<kml xmlns="http://www.opengis.net/kml/2.2">\n
          <Document>\n
            <name>KML Sample</name>\n
            <open>1</open>\n
            <description>An incomplete example of a KML docum
        ent - used as an example!</description>\n
          </Document>\n
        </kml>

    5.  Handling Unrecognized Properties or Parameters

       In iCalendar, properties have a default value type specified by their
       definition, e.g., "SUMMARY"'s value type is "TEXT" and "DURATION"'s
       is "DURATION".  When a property uses its default value type, the
       "VALUE" property parameter does not need to be specified on the
       property.

       When new properties are defined or "X-" properties are used, an
       iCalendar<->xCal converter might not recognize them, and know what
       the appropriate default value types are, yet they need to be able to
       preserve the values.  A similar issue arises for unrecognized
       property parameters.  As a result, the following rules are applied
       when dealing with unrecognized properties and property parameters:

       o  When converting iCalendar into xCal:

          *  Any property that does not include a "VALUE" property parameter
             and whose default value type is not known MUST be converted
             using the value type XML element IC:unknown.  The content of
             that element is the unprocessed value text.

          *  Any unrecognized property parameter MUST be converted using the
             value type XML element IC:unknown, with its content set to the
             property parameter value text, treated as if it were a "TEXT"
             value or list of "TEXT" values.

    Daboo, et al.                Standards Track                   [Page 18]

    RFC 6321                          xCal                       August 2011

       o  When converting xCal into iCalendar:

          *  Any IC:unknown property value XML elements are converted
             directly into iCalendar values.  The containing property MUST
             NOT have a "VALUE" property parameter.

          *  Any IC:unknown parameter value XML elements are converted as if
             they were IC:text value type XML elements.

       Example: The following is an example of an unrecognized iCalendar
       property (that uses a "DATE-TIME" value as its default) and the
       equivalent xCal representation of that property.

       iCalendar:

       X-PROPERTY:20110512T120000Z

       xCal:

       <x-property>
         <unknown>20110512T120000Z</unknown>
       </x-property>

       Example: The following is an example of an unrecognized iCalendar
       property parameter (that uses a "DURATION" value as its default)
       specified on a recognized iCalendar property, and the equivalent xCal
       representation of that property and property parameter.

       iCalendar:

       DTSTART;X-PARAM=PT30M:20110512T130000Z

       xCal:

       <dtstart>
         <parameters>
           <x-param><unknown>PT30M</unknown></x-param>
         </parameters>
         <date-time>2011-05-12T13:00:00Z</date-time>
       </dtstart>

    6.  Security Considerations

       For security considerations specific to calendar data, see Section 7
       of [RFC5545].  Since this specification is a mapping from iCalendar,
       no new security concerns are introduced related to calendar data.

    Daboo, et al.                Standards Track                   [Page 19]

    RFC 6321                          xCal                       August 2011

       The use of XML as a format does have security risks.  Section 7 of
       [RFC3470] discusses these risks.  See also the security discussion
       for the application/xml type in [RFC3023].

    7.  IANA Considerations

       This document defines a new URN to identify a new XML namespace for
       iCalendar data.  The URN conforms to a registry mechanism described
       in [RFC3688].

       This document defines a new media type.  The registration is in
       Section 7.2.

       This document defines a new property for iCalendar.  The registration
       is in Section 7.3.

    7.1.  Namespace Registration

       Registration request for the iCalendar namespace:

       URI: urn:ietf:params:xml:ns:icalendar-2.0

       Registrant Contact: See the "Authors' Addresses" section of this
       document.

       XML: None.  Namespace URIs do not represent an XML specification.

    7.2.  Media Type

       This section defines the MIME media type for use with iCalendar in
       XML data.

       Type name:  application

       Subtype name:  calendar+xml

       Required parameters:  None

       Optional parameters:  method, component, and optinfo as defined for
          the text/calendar media type in [RFC5545]; charset as defined for
          application/xml in [RFC3023]; per [RFC3023], use of the charset
          property parameter with the value "utf-8" is STRONGLY RECOMMENDED.

       Encoding considerations:  Same as encoding considerations of
          application/xml as specified in [RFC3023].

    Daboo, et al.                Standards Track                   [Page 20]

    RFC 6321                          xCal                       August 2011

       Security considerations:  See Section 6.

       Interoperability considerations:  This media type provides an
          alternative format for iCalendar data based on XML.

       Published specification:  This specification.

       Applications that use this media type:  Applications that currently
          make use of the text/calendar media type can use this as an
          alternative.

       Additional information:

          Magic number(s):  None

          File extension(s):  xcs

          Macintosh file type code(s):  None specified.

       Person & email address to contact for further information:
          calsify@ietf.org

       Intended usage:  COMMON

       Restrictions on usage:  There are no restrictions on where this media
          type can be used.

       Author:  See the "Authors' Addresses" section of this document.

       Change controller:  IETF

    7.3.  iCalendar Property Registrations

       This document defines the following new iCalendar property to be
       added to the registry defined in Section 8.2.3 of [RFC5545]:

                  +----------+---------+-----------------------+
                  | Property | Status  | Reference             |
                  +----------+---------+-----------------------+
                  | XML      | Current | RFC 6321, Section 4.2 |
                  +----------+---------+-----------------------+

    Daboo, et al.                Standards Track                   [Page 21]

    RFC 6321                          xCal                       August 2011

    8.  Acknowledgments

       The authors would like to thank the following for their valuable
       contributions: Toby Considine, Bernard Desruisseaux, Keith Moore,
       Filip Navara, Simon Perreault, Arnaud Quillaud, Peter Saint-Andre,
       and Dave Thewlis.  This specification originated from the work of the
       XML technical committee of the Calendaring and Scheduling Consortium.

    9.  References

    9.1.  Normative References

       [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
                  Requirement Levels", BCP 14, RFC 2119, March 1997.

       [RFC3023]  Murata, M., St. Laurent, S., and D. Kohn, "XML Media
                  Types", RFC 3023, January 2001.

       [RFC3470]  Hollenbeck, S., Rose, M., and L. Masinter, "Guidelines for
                  the Use of Extensible Markup Language (XML)
                  within IETF Protocols", BCP 70, RFC 3470, January 2003.

       [RFC3688]  Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
                  January 2004.

       [RFC4648]  Josefsson, S., "The Base16, Base32, and Base64 Data
                  Encodings", RFC 4648, October 2006.

       [RFC5545]  Desruisseaux, B., "Internet Calendaring and Scheduling
                  Core Object Specification (iCalendar)", RFC 5545,
                  September 2009.

       [W3C.REC-xml-20081126]
                  Sperberg-McQueen, C., Yergeau, F., Bray, T., Paoli, J.,
                  and E. Maler, "Extensible Markup Language (XML) 1.0 (Fifth
                  Edition)", World Wide Web Consortium Recommendation REC-
                  xml-20081126, November 2008,
                  <http://www.w3.org/TR/2008/REC-xml-20081126>.

    9.2.  Informative References

       [W3C.REC-xmlschema-2-20041028]
                  Malhotra, A. and P. Biron, "XML Schema Part 2: Datatypes
                  Second Edition", World Wide Web Consortium
                  Recommendation REC-xmlschema-2-20041028, October 2004,
                  <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.

    Daboo, et al.                Standards Track                   [Page 22]

    RFC 6321                          xCal                       August 2011

    Appendix A.  RELAX NG Schema

       Below is a RELAX NG schema for iCalendar in XML.  The schema is non-
       normative and given for reference only.

       This schema uses the compact notation of RELAX NG.  The numeric
       section numbers given in the comments refer to sections in [RFC5545].
       The ordering of elements follows the section ordering of [RFC5545].

       The RELAX NG compact notation "?" operator is used to indicate an
       unordered list of items.  However, that operator, as defined, allows
       "mixing" each element that it operates on at any depth within the
       other elements, rather than just allowing "mixing" of siblings only.
       As a result, the schema provided allows certain constructs that are
       not allowed in iCalendar.  Given that there is no sibling-only
       unordered list operator in RELAX NG, this is the best representation
       that can be given.

       Patterns for date/time, duration, and UTC offset values are given
       because those differ from the values used in iCalendar.  More
       restrictive schema with patterns and numerical limits could be
       derived from the example schema here if more comprehensive schema
       validation is required.

       # RELAX NG Schema for iCalendar in XML

       default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"

       # 3.2 Property Parameters

       # 3.2.1 Alternate Text Representation

       altrepparam = element altrep {
           value-uri
       }

       # 3.2.2 Common Name

       cnparam = element cn {
           value-text
       }

    Daboo, et al.                Standards Track                   [Page 23]

    RFC 6321                          xCal                       August 2011

       # 3.2.3 Calendar User Type

       cutypeparam = element cutype {
           element text {
               "INDIVIDUAL" |
               "GROUP" |
               "RESOURCE" |
               "ROOM" |
               "UNKNOWN"
           }
       }

       # 3.2.4 Delegators

       delfromparam = element delegated-from {
           value-cal-address+
       }

       # 3.2.5 Delegatees

       deltoparam = element delegated-to {
           value-cal-address+
       }

       # 3.2.6 Directory Entry Reference

       dirparam = element dir {
           value-uri
       }

       # 3.2.7 Inline Encoding

       encodingparam = element encoding {
           element text {
               "8BIT" |
               "BASE64"
           }
       }

       # 3.2.8 Format Type

       fmttypeparam = element fmttype {
           value-text
       }

    Daboo, et al.                Standards Track                   [Page 24]

    RFC 6321                          xCal                       August 2011

       # 3.2.9 Free/Busy Time Type

       fbtypeparam = element fbtype {
           element text {
               "FREE" |
               "BUSY" |
               "BUSY-UNAVAILABLE" |
               "BUSY-TENTATIVE"
           }
       }

       # 3.2.10 Language

       languageparam = element language {
           value-text
       }

       # 3.2.11 Group or List Membership

       memberparam = element member {
           value-cal-address+
       }

       # 3.2.12 Participation Status

       partstatparam = element partstat {
           type-partstat-event |
           type-partstat-todo |
           type-partstat-jour
       }

       type-partstat-event = (
           element text {
               "NEEDS-ACTION" |
               "ACCEPTED" |
               "DECLINED" |
               "TENTATIVE" |
               "DELEGATED"
           }
       )

    Daboo, et al.                Standards Track                   [Page 25]

    RFC 6321                          xCal                       August 2011

       type-partstat-todo = (
           element text {
               "NEEDS-ACTION" |
               "ACCEPTED" |
               "DECLINED" |
               "TENTATIVE" |
               "DELEGATED" |
               "COMPLETED" |
               "IN-PROCESS"
           }
       )

       type-partstat-jour = (
           element text {
               "NEEDS-ACTION" |
               "ACCEPTED" |
               "DECLINED"
           }
       )

       # 3.2.13 Recurrence Identifier Range

       rangeparam = element range {
           element text {
               "THISANDFUTURE"
           }
       }

       # 3.2.14 Alarm Trigger Relationship

       trigrelparam = element related {
           element text {
               "START" |
               "END"
           }
       }

       # 3.2.15 Relationship Type

       reltypeparam = element reltype {
           element text {
               "PARENT" |
               "CHILD" |
               "SIBLING"
           }
       }

    Daboo, et al.                Standards Track                   [Page 26]

    RFC 6321                          xCal                       August 2011

       # 3.2.16 Participation Role

       roleparam = element role {
           element text {
               "CHAIR" |
               "REQ-PARTICIPANT" |
               "OPT-PARTICIPANT" |
               "NON-PARTICIPANT"
           }
       }

       # 3.2.17 RSVP Expectation

       rsvpparam = element rsvp {
           value-boolean
       }

       # 3.2.18 Sent By

       sentbyparam = element sent-by {
           value-cal-address
       }

       # 3.2.19 Time Zone Identifier

       tzidparam = element tzid {
           value-text
       }

       # 3.3 Property Value Data Types

       # 3.3.1 BINARY

       value-binary =  element binary {
           xsd:string
       }

       # 3.3.2 BOOLEAN

       value-boolean = element boolean {
           xsd:boolean
       }

       # 3.3.3 CAL-ADDRESS

       value-cal-address = element cal-address {
           xsd:anyURI
       }

    Daboo, et al.                Standards Track                   [Page 27]

    RFC 6321                          xCal                       August 2011

       # 3.3.4 DATE

       pattern-date = xsd:string {
           pattern = "\d\d\d\d-\d\d-\d\d"
       }

       value-date = element date {
           pattern-date
       }

       # 3.3.5 DATE-TIME

       pattern-date-time = xsd:string {
           pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
       }

       value-date-time = element date-time {
           pattern-date-time
       }

       # 3.3.6 DURATION

       pattern-duration = xsd:string {
           pattern = "(+|-)?P(\d+W)|(\d+D)?"
                   ~ "(T(\d+H(\d+M)?(\d+S)?)|"
                   ~   "(\d+M(\d+S)?)|"
                   ~   "(\d+S))?"
       }

       value-duration = element duration {
           pattern-duration
       }

       # 3.3.7 FLOAT

       value-float = element float {
           xsd:float
       }

       # 3.3.8 INTEGER

       value-integer = element integer {
           xsd:integer
       }

    Daboo, et al.                Standards Track                   [Page 28]

    RFC 6321                          xCal                       August 2011

       # 3.3.9 PERIOD

       value-period = element period {
           element start {
               pattern-date-time
           },
           (
               element end {
                   pattern-date-time
               } |
               element duration {
                   pattern-duration
               }
           )
       }

       # 3.3.10 RECUR

       value-recur = element recur {
           type-freq,
           (type-until | type-count)?,
           element interval {
               xsd:positiveInteger
           }?,
           type-bysecond*,
           type-byminute*,
           type-byhour*,
           type-byday*,
           type-bymonthday*,
           type-byyearday*,
           type-byweekno*,
           type-bymonth*,
           type-bysetpos*,
           element wkst { type-weekday }?
       }

       type-freq = element freq {
           "SECONDLY" |
           "MINUTELY" |
           "HOURLY"   |
           "DAILY"    |
           "WEEKLY"   |
           "MONTHLY"  |
           "YEARLY"
       }

    Daboo, et al.                Standards Track                   [Page 29]

    RFC 6321                          xCal                       August 2011

       type-until = element until {
           type-date |
           type-date-time
       }

       type-count = element count {
           xsd:positiveInteger
       }

       type-bysecond = element bysecond {
           xsd:positiveInteger
       }

       type-byminute = element byminute {
           xsd:positiveInteger
       }

       type-byhour = element byhour {
           xsd:positiveInteger
       }

       type-weekday = (
           "SU" |
           "MO" |
           "TU" |
           "WE" |
           "TH" |
           "FR" |
           "SA"
       )

       type-byday = element byday {
           xsd:integer?,
           type-weekday
       }

       type-bymonthday = element bymonthday {
           xsd:integer
       }

       type-byyearday = element byyearday {
           xsd:integer
       }

       type-byweekno = element byweekno {
           xsd:integer
       }

    Daboo, et al.                Standards Track                   [Page 30]

    RFC 6321                          xCal                       August 2011

       type-bymonth = element bymonth {
           xsd:positiveInteger
       }

       type-bysetpos = element bysetpos {
           xsd:integer
       }

       # 3.3.11 TEXT

       value-text = element text {
           xsd:string
       }

       # 3.3.12 TIME

       pattern-time = xsd:string {
           pattern = "\d\d:\d\d:\d\dZ?"
       }

       value-time = element time {
           pattern-time
       }

       # 3.3.13 URI

       value-uri = element uri {
           xsd:anyURI
       }

       # 3.3.14 UTC-OFFSET

       value-utc-offset = element utc-offset {
           xsd:string { pattern = "(+|-)\d\d:\d\d(:\d\d)?" }
       }

       # UNKNOWN

       value-unknown = element unknown {
           xsd:string
       }

       # 3.4 iCalendar Stream

       start = element icalendar {
           vcalendar+
       }

    Daboo, et al.                Standards Track                   [Page 31]

    RFC 6321                          xCal                       August 2011

       # 3.6 Calendar Components

       vcalendar = element vcalendar {
           type-calprops,
           type-component
       }

       type-calprops = element properties {
           property-prodid &
           property-version &
           property-calscale? &
           property-method?
       }

       type-component = element components {
           (
               component-vevent |
               component-vtodo |
               component-vjournal |
               component-vfreebusy |
               component-vtimezone
           )*
       }

       # 3.6.1 Event Component

       component-vevent = element vevent {
           type-eventprop,
           element components {
               component-valarm+
           }?
       }

       type-eventprop = element properties {
           property-dtstamp &
           property-dtstart &
           property-uid &

           property-class? &
           property-created? &
           property-description? &
           property-geo? &
           property-last-mod? &
           property-location? &
           property-organizer? &
           property-priority? &
           property-seq? &
           property-status-event? &

    Daboo, et al.                Standards Track                   [Page 32]

    RFC 6321                          xCal                       August 2011

           property-summary? &
           property-transp? &
           property-url? &
           property-recurid? &

           property-rrule? &

           (property-dtend | property-duration)? &

           property-attach* &
           property-attendee* &
           property-categories* &
           property-comment* &
           property-contact* &
           property-exdate* &
           property-rstatus* &
           property-related* &
           property-resources* &
           property-rdate*
       }

       # 3.6.2 To-do Component

       component-vtodo = element vtodo {
           type-todoprop,
           element components {
               component-valarm+
           }?
       }

       type-todoprop = element properties {
           property-dtstamp &
           property-uid &

           property-class? &
           property-completed? &
           property-created? &
           property-description? &
           property-geo? &
           property-last-mod? &
           property-location? &
           property-organizer? &
           property-percent? &
           property-priority? &
           property-recurid? &
           property-seq? &
           property-status-todo? &
           property-summary? &

    Daboo, et al.                Standards Track                   [Page 33]

    RFC 6321                          xCal                       August 2011

           property-url? &

           property-rrule? &

           (
               (property-dtstart?, property-dtend? ) |
               (property-dtstart, property-duration)?
           ) &

           property-attach* &
           property-attendee* &
           property-categories* &
           property-comment* &
           property-contact* &
           property-exdate* &
           property-rstatus* &
           property-related* &
           property-resources* &
           property-rdate*
       }

       # 3.6.3 Journal Component

       component-vjournal = element vjournal {
           type-jourprop
       }

       type-jourprop = element properties {
           property-dtstamp &
           property-uid &

           property-class? &
           property-created? &
           property-dtstart? &
           property-last-mod? &
           property-organizer? &
           property-recurid? &
           property-seq? &
           property-status-jour? &
           property-summary? &
           property-url? &

           property-rrule? &

           property-attach* &
           property-attendee* &
           property-categories* &
           property-comment* &

    Daboo, et al.                Standards Track                   [Page 34]

    RFC 6321                          xCal                       August 2011

           property-contact* &
           property-description? &
           property-exdate* &
           property-related* &
           property-rdate* &
           property-rstatus*
       }

       # 3.6.4 Free/Busy Component

       component-vfreebusy = element vfreebusy {
           type-fbprop
       }

       type-fbprop = element properties {
           property-dtstamp &
           property-uid &

           property-contact? &
           property-dtstart? &
           property-dtend? &
           property-duration? &
           property-organizer? &
           property-url? &

           property-attendee* &
           property-comment* &
           property-freebusy* &
           property-rstatus*
       }

       # 3.6.5 Time Zone Component

       component-vtimezone = element vtimezone {
           element properties {
               property-tzid &

               property-last-mod? &
               property-tzuurl?
           },
           element components {
               (component-standard | component-daylight) &
               component-standard* &
               component-daylight*
           }
       }

    Daboo, et al.                Standards Track                   [Page 35]

    RFC 6321                          xCal                       August 2011

       component-standard = element standard {
           type-tzprop
       }

       component-daylight = element daylight {
           type-tzprop
       }

       type-tzprop = element properties {
           property-dtstart &
           property-tzoffsetto &
           property-tzoffsetfrom &

           property-rrule? &

           property-comment* &
           property-rdate* &
           property-tzname*
       }

       # 3.6.6 Alarm Component

       component-valarm = element valarm {
           audioprop | dispprop | emailprop
       }

       type-audioprop = element properties {
           property-action &

           property-trigger &

           (property-duration, property-repeat)? &

           property-attach?
       }

       type-dispprop = element properties {
           property-action &
           property-description &
           property-trigger &
           property-summary &

           property-attendee+ &

           (property-duration, property-repeat)? &

           property-attach*
       }

    Daboo, et al.                Standards Track                   [Page 36]

    RFC 6321                          xCal                       August 2011

       type-emailprop = element properties {
           property-action &
           property-description &
           property-trigger &

           (property-duration, property-repeat)?
       }

       # 3.7 Calendar Properties

       # 3.7.1 Calendar Scale

       property-calscale = element calscale {

           element parameters { empty }?,

           element text { "GREGORIAN" }
       }

       # 3.7.2 Method

       property-method = element method {

           element parameters { empty }?,

           value-text
       }

       # 3.7.3 Product Identifier

       property-prodid = element prodid {

           element parameters { empty }?,

           value-text
       }

       # 3.7.4 Version

       property-version = element version {

           element parameters { empty }?,

           element text { "2.0" }
       }

    Daboo, et al.                Standards Track                   [Page 37]

    RFC 6321                          xCal                       August 2011

       # 3.8 Component Properties

       # 3.8.1 Descriptive Component Properties

       # 3.8.1.1 Attachment

       property-attach = element attach {

           element parameters {
               fmttypeparam? &
               encodingparam?
           }?,

           value-uri | value-binary
       }

       # 3.8.1.2 Categories

       property-categories = element categories {

           element parameters {
               languageparam? &
           }?,

           value-text+
       }

       # 3.8.1.3 Classification

       property-class = element class {

           element parameters { empty }?,

           element text {
               "PUBLIC" |
               "PRIVATE" |
               "CONFIDENTIAL"
           }
       }

       # 3.8.1.4 Comment

       property-comment = element comment {

           element parameters {
               altrepparam? &
               languageparam?
           }?,

    Daboo, et al.                Standards Track                   [Page 38]

    RFC 6321                          xCal                       August 2011

           value-text
       }

       # 3.8.1.5 Description

       property-description = element description {

           element parameters {
               altrepparam? &
               languageparam?
           }?,

           value-text
       }

       # 3.8.1.6 Geographic Position

       property-geo = element geo {

           element parameters { empty }?,

           element latitude  { xsd:float },
           element longitude { xsd:float }
       }

       # 3.8.1.7 Location

       property-location = element location {

           element parameters {

               altrepparam? &
               languageparam?
           }?,

           value-text
       }

       # 3.8.1.8 Percent Complete

       property-percent = element percent-complete {

           element parameters { empty }?,

           value-integer
       }

    Daboo, et al.                Standards Track                   [Page 39]

    RFC 6321                          xCal                       August 2011

       # 3.8.1.9 Priority

       property-priority = element priority {

           element parameters { empty }?,

           value-integer
       }

       # 3.8.1.10 Resources

       property-resources = element resources {

           element parameters {
               altrepparam? &
               languageparam?
           }?,

           value-text+
       }

       # 3.8.1.11 Status

       property-status-event = element status {

           element parameters { empty }?,

           element text {
               "TENTATIVE" |
               "CONFIRMED" |
               "CANCELLED"
           }
       }

       property-status-todo = element status {

           element parameters { empty }?,

           element text {
               "NEEDS-ACTION" |
               "COMPLETED" |
               "IN-PROCESS" |
               "CANCELLED"
           }
       }

    Daboo, et al.                Standards Track                   [Page 40]

    RFC 6321                          xCal                       August 2011

       property-status-jour = element status {

           element parameters { empty }?,

           element text {
               "DRAFT" |
               "FINAL" |
               "CANCELLED"
           }
       }

       # 3.8.1.12 Summary

       property-summary = element summary {

           element parameters {
               altrepparam? &
               languageparam?
           }?,

           value-text
       }

       # 3.8.2 Date and Time Component Properties

       # 3.8.2.1 Date/Time Completed

       property-completed = element completed {

           element parameters { empty }?,

           value-date-time
       }

       # 3.8.2.2 Date/Time End

       property-dtend = element dtend {

           element parameters {
               tzidparam?
           }?,

           value-date-time |
           value-date
       }

    Daboo, et al.                Standards Track                   [Page 41]

    RFC 6321                          xCal                       August 2011

       # 3.8.2.3 Date/Time Due

       property-due = element due {

           element parameters {
               tzidparam?
           }?,

           value-date-time |
           value-date
       }

       # 3.8.2.4 Date/Time Start

       property-dtstart = element dtstart {

           element parameters {
               tzidparam?
           }?,

           value-date-time |
           value-date
       }

       # 3.8.2.5 Duration

       property-duration = element duration {

           element parameters { empty }?,

           value-duration
       }

       # 3.8.2.6 Free/Busy Time

       property-freebusy = element freebusy {

           element parameters {
               fbtypeparam?
           }?,

           value-period+
       }

       # 3.8.2.7 Time Transparency

       property-transp = element transp {

    Daboo, et al.                Standards Track                   [Page 42]

    RFC 6321                          xCal                       August 2011

           element parameters { empty }?,

           element text {
               "OPAQUE" |
               "TRANSPARENT"
           }
       }

       # 3.8.3 Time Zone Component Properties

       # 3.8.3.1 Time Zone Identifier

       property-tzid = element tzid {

           element parameters { empty }?,

           value-text
       }

       # 3.8.3.2 Time Zone Name

       property-tzname = element tzname {

           element parameters {
               languageparam?
           }?,

           value-text
       }

       # 3.8.3.3 Time Zone Offset From

       property-tzoffsetfrom = element tzoffsetfrom {

           element parameters { empty }?,

           value-utc-offset
       }

       # 3.8.3.4 Time Zone Offset To

       property-tzoffsetto = element tzoffsetto {

           element parameters { empty }?,

           value-utc-offset
       }

    Daboo, et al.                Standards Track                   [Page 43]

    RFC 6321                          xCal                       August 2011

       # 3.8.3.5 Time Zone URL

       property-tzurl = element tzurl {

           element parameters { empty }?,

           value-uri
       }

       # 3.8.4 Relationship Component Properties

       # 3.8.4.1 Attendee

       property-attendee = element attendee {

           element parameters {
               cutypeparam? &
               memberparam? &
               roleparam? &
               partstatparam? &
               rsvpparam? &
               deltoparam? &
               delfromparam? &
               sentbyparam? &
               cnparam? &
               dirparam? &
               languageparam?
           }?,

           value-cal-address
       }

       # 3.8.4.2 Contact

       property-contact = element contact {

           element parameters {
               altrepparam? &
               languageparam?
           }?,

           value-text
       }

       # 3.8.4.3 Organizer

       property-organizer = element organizer {

    Daboo, et al.                Standards Track                   [Page 44]

    RFC 6321                          xCal                       August 2011

           element parameters {
               cnparam? &
               dirparam? &
               sentbyparam? &
               languageparam?
           }?,

           value-cal-address
       }

       # 3.8.4.4 Recurrence ID

       property-recurid = element recurrence-id {

           element parameters {
               tzidparam? &
               rangeparam?
           }?,

           value-date-time |
           value-date
       }

       # 3.8.4.5 Related-To

       property-related = element related-to {

           element parameters {
               reltypeparam?
           }?,

           value-text
       }

       # 3.8.4.6 Uniform Resource Locator

       property-url = element url {

           element parameters { empty }?,

           value-uri
       }

       # 3.8.4.7 Unique Identifier

       property-uid = element uid {

           element parameters { empty }?,

    Daboo, et al.                Standards Track                   [Page 45]

    RFC 6321                          xCal                       August 2011

           value-text
       }

       # 3.8.5 Recurrence Component Properties

       # 3.8.5.1 Exception Date/Times

       property-exdate = element exdate {

           element parameters {
               tzidparam?
           }?,

           value-date-time+ |
           value-date+
       }

       # 3.8.5.2 Recurrence Date/Times

       property-rdate = element rdate {

           element parameters {
               tzidparam?
           }?,

           value-date-time+ |
           value-date+ |
           value-period+
       }

       # 3.8.5.3 Recurrence Rule

       property-rrule = element rrule {

           element parameters { empty }?,

           value-recur
       }

       # 3.8.6 Alarm Component Properties

       # 3.8.6.1 Action

       property-action = element action {

           element parameters { empty }?,

    Daboo, et al.                Standards Track                   [Page 46]

    RFC 6321                          xCal                       August 2011

           element text {
               "AUDIO" |
               "DISPLAY" |
               "EMAIL"
           }
       }

       # 3.8.6.2 Repeat Count

       property-repeat = element repeat {

           element parameters { empty }?,

           value-integer
       }

       # 3.8.6.3 Trigger

       property-trigger = element trigger {

           (
               element parameters {
                   trigrelparam?
               }?,

               value-duration
           ) |
           (
               element parameters { empty }?,

               value-date-time
           )
       }

       # 3.8.7 Change Management Component Properties

       # 3.8.7.1 Date/Time Created

       property-created = element created {

           element parameters { empty }?,

           value-date-time
       }

       # 3.8.7.2 Date/Time Stamp

       property-dtstamp = element dtstamp {

    Daboo, et al.                Standards Track                   [Page 47]

    RFC 6321                          xCal                       August 2011

           element parameters { empty }?,

           value-date-time
       }

       # 3.8.7.3 Last Modified

       property-last-mod = element last-modified {

           element parameters { empty }?,

           value-date-time
       }

       # 3.8.7.4 Sequence Number

       property-seq = element sequence {

           element parameters { empty }?,

           value-integer
       }

       # 3.8.8 Miscellaneous Component Properties

       # 3.8.8.3 Request Status

       property-rstatus = element request-status {

           element parameters {
               languageparam?
           }?,

           element code { xsd:string },
           element description { xsd:string },
           element data { xsd:string }?
       }

    Daboo, et al.                Standards Track                   [Page 48]

    RFC 6321                          xCal                       August 2011

    Appendix B.  Examples

       This section contains two examples of iCalendar objects with their
       xCal representation.

    B.1.  Example 1

    B.1.1.  iCalendar Data

       BEGIN:VCALENDAR
       CALSCALE:GREGORIAN
       PRODID:-//Example Inc.//Example Calendar//EN
       VERSION:2.0
       BEGIN:VEVENT
       DTSTAMP:20080205T191224Z
       DTSTART:20081006
       SUMMARY:Planning meeting
       UID:4088E990AD89CB3DBB484909
       END:VEVENT
       END:VCALENDAR

    B.1.2.  XML Data

       <?xml version="1.0" encoding="utf-8"?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
        <vcalendar>
         <properties>
          <calscale>
            <text>GREGORIAN</text>
          </calscale>
          <prodid>
           <text>-//Example Inc.//Example Calendar//EN</text>
          </prodid>
          <version>
            <text>2.0</text>
          </version>
         </properties>
         <components>
          <vevent>
           <properties>
            <dtstamp>
              <date-time>2008-02-05T19:12:24Z</date-time>
            </dtstamp>
            <dtstart>
              <date>2008-10-06</date>
            </dtstart>
            <summary>
             <text>Planning meeting</text>

    Daboo, et al.                Standards Track                   [Page 49]

    RFC 6321                          xCal                       August 2011

            </summary>
            <uid>
             <text>4088E990AD89CB3DBB484909</text>
            </uid>
           </properties>
          </vevent>
         </components>
        </vcalendar>
       </icalendar>

    B.2.  Example 2

    B.2.1.  iCalendar Data

       VERSION:2.0
       PRODID:-//Example Corp.//Example Client//EN
       BEGIN:VTIMEZONE
       LAST-MODIFIED:20040110T032845Z
       TZID:US/Eastern
       BEGIN:DAYLIGHT
       DTSTART:20000404T020000
       RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
       TZNAME:EDT
       TZOFFSETFROM:-0500
       TZOFFSETTO:-0400
       END:DAYLIGHT
       BEGIN:STANDARD
       DTSTART:20001026T020000
       RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
       TZNAME:EST
       TZOFFSETFROM:-0400
       TZOFFSETTO:-0500
       END:STANDARD
       END:VTIMEZONE
       BEGIN:VEVENT
       DTSTAMP:20060206T001121Z
       DTSTART;TZID=US/Eastern:20060102T120000
       DURATION:PT1H
       RRULE:FREQ=DAILY;COUNT=5
       RDATE;TZID=US/Eastern;VALUE=PERIOD:20060102T150000/PT2H
       SUMMARY:Event #2
       DESCRIPTION:We are having a meeting all this week at 12 pm fo
        r one hour\, with an additional meeting on the first day 2 h
        ours long.\nPlease bring your own lunch for the 12 pm meetin
        gs.
       UID:00959BC664CA650E933C892C@example.com
       END:VEVENT
       BEGIN:VEVENT

    Daboo, et al.                Standards Track                   [Page 50]

    RFC 6321                          xCal                       August 2011

       DTSTAMP:20060206T001121Z
       DTSTART;TZID=US/Eastern:20060104T140000
       DURATION:PT1H
       RECURRENCE-ID;TZID=US/Eastern:20060104T120000
       SUMMARY:Event #2 bis
       UID:00959BC664CA650E933C892C@example.com
       END:VEVENT
       END:VCALENDAR

    B.2.2.  XML Data

       <?xml version="1.0" encoding="utf-8" ?>
       <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
         <vcalendar>
           <properties>
             <prodid>
               <text>-//Example Inc.//Example Client//EN</text>
             </prodid>
             <version>
               <text>2.0</text>
             </version>
           </properties>
           <components>
             <vtimezone>
               <properties>
                 <last-modified>
                   <date-time>2004-01-10T03:28:45Z</date-time>
                 </last-modified>
                 <tzid>US/Eastern</tzid>
               </properties>
               <components>
                 <daylight>
                   <properties>
                     <dtstart>
                       <date-time>2000-04-04T02:00:00</date-time>
                     </dtstart>
                     <rrule>
                       <recur>
                         <freq>YEARLY</freq>
                         <byday>1SU</byday>
                         <bymonth>4</bymonth>
                       </recur>
                     </rrule>
                     <tzname>
                       <text>EDT</text>
                     </tzname>
                     <tzoffsetfrom>
                       <utc-offset>-05:00</utc-offset>

    Daboo, et al.                Standards Track                   [Page 51]

    RFC 6321                          xCal                       August 2011

                     </tzoffsetfrom>
                     <tzoffsetto>
                       <utc-offset>-04:00</utc-offset>
                     </tzoffsetto>
                   </properties>
                 </daylight>
                 <standard>
                   <properties>
                     <dtstart>
                       <date-time>2000-10-26T02:00:00</date-time>
                     </dtstart>
                     <rrule>
                       <recur>
                         <freq>YEARLY</freq>
                         <byday>-1SU</byday>
                         <bymonth>10</bymonth>
                       </recur>
                     </rrule>
                     <tzname>
                       <text>EST</text>
                     </tzname>
                     <tzoffsetfrom>
                       <utc-offset>-04:00</utc-offset>
                     </tzoffsetfrom>
                     <tzoffsetto>
                       <utc-offset>-05:00</utc-offset>
                     </tzoffsetto>
                   </properties>
                 </standard>
               </components>
             </vtimezone>
             <vevent>
               <properties>
                 <dtstamp>
                   <date-time>2006-02-06T00:11:21Z</date-time>
                 </dtstamp>
                 <dtstart>
                   <parameters>
                     <tzid><text>US/Eastern</text></tzid>
                   </parameters>
                   <date-time>2006-01-02T12:00:00</date-time>
                 </dtstart>
                 <duration>
                   <duration>PT1H</duration>
                 </duration>
                 <rrule>
                   <recur>
                     <freq>DAILY</freq>

    Daboo, et al.                Standards Track                   [Page 52]

    RFC 6321                          xCal                       August 2011

                     <count>5</count>
                   </recur>
                 </rrule>
                 <rdate>
                   <parameters>
                     <tzid><text>US/Eastern</text></tzid>
                   </parameters>
                   <period>
                     <start>2006-01-02T15:00:00</start>
                     <duration>PT2H</duration>
                   </period>
                 </rdate>
                 <summary>
                   <text>Event #2</text>
                 </summary>
                 <description>
                   <text>We are having a meeting all this week at 12
       pm for one hour, with an additional meeting on the first day
       2 hours long.&#x0a;Please bring your own lunch for the 12 pm
       meetings.</text>
                 </description>
                 <uid>
                   <text>00959BC664CA650E933C892C@example.com</text>
                 </uid>
               </properties>
             </vevent>
             <vevent>
               <properties>
                 <dtstamp>
                   <date-time>2006-02-06T00:11:21Z</date-time>
                 </dtstamp>
                 <dtstart>
                   <parameters>
                     <tzid><text>US/Eastern</text></tzid>
                   </parameters>
                   <date-time>2006-01-04T14:00:00</date-time>
                 </dtstart>
                 <duration>
                   <duration>PT1H</duration>
                 </duration>
                 <recurrence-id>
                   <parameters>
                     <tzid><text>US/Eastern</text></tzid>
                   </parameters>
                   <date-time>2006-01-04T12:00:00</date-time>
                 </recurrence-id>
                 <summary>
                   <text>Event #2 bis</text>

    Daboo, et al.                Standards Track                   [Page 53]

    RFC 6321                          xCal                       August 2011

                 </summary>
                 <uid>
                   <text>00959BC664CA650E933C892C@example.com</text>
                 </uid>
               </properties>
             </vevent>
           </components>
         </vcalendar>
       </icalendar>

    Authors' Addresses

       Cyrus Daboo
       Apple Inc.
       1 Infinite Loop
       Cupertino, CA  95014
       USA

       EMail: cyrus@daboo.name
       URI:   http://www.apple.com/

       Mike Douglass
       Rensselaer Polytechnic Institute
       110 8th Street
       Troy, NY  12180
       USA

       EMail: douglm@rpi.edu
       URI:   http://www.rpi.edu/

       Steven Lees
       Microsoft Corporation
       One Microsoft Way
       Redmond, WA  98052
       USA

       EMail: steven.lees@microsoft.com
       URI:   http://www.microsoft.com/

    Daboo, et al.                Standards Track                   [Page 54]