<?xml version="1.0" encoding="UTF-8"?>
<!--***********************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 ***********************************************************-->



<!ELEMENT oor:component-data ((node | prop)*)>
<!ATTLIST oor:component-data
    oor:package CDATA #REQUIRED
    oor:name CDATA #REQUIRED
    oor:op (modify | replace | fuse | remove) #IMPLIED
    oor:finalized (false | true) #IMPLIED
    xmlns:oor CDATA #FIXED "http://openoffice.org/2001/registry"
    xmlns:xs CDATA #FIXED "http://www.w3.org/2001/XMLSchema"
    xmlns:xsi CDATA #FIXED "http://www.w3.org/2001/XMLSchema-instance"
    xmlns:install CDATA #FIXED "http://openoffice.org/2004/installation">

<!ELEMENT node ((node | prop)*)>
<!ATTLIST node
    oor:name CDATA #REQUIRED
    oor:op (modify | replace | fuse | remove) #IMPLIED
    oor:finalized (true | false) #IMPLIED
    oor:mandatory (true | false) #IMPLIED
    oor:node-type CDATA #IMPLIED
    oor:component CDATA #IMPLIED
    install:module CDATA #IMPLIED>

<!ELEMENT prop (value*)>
<!ATTLIST prop
    oor:name CDATA #REQUIRED
    oor:op (modify | replace | fuse | remove) #IMPLIED
    oor:finalized (true | false) #IMPLIED
    oor:type
        (oor:any | xs:boolean | xs:short | xs:int | xs:long | xs:double |
         xs:string | xs:hexBinary | oor:boolean-list | oor:short-list |
         oor:int-list | oor:long-list | oor:double-list | oor:string-list |
         oor:hexBinary-list)
        #IMPLIED
    install:module CDATA #IMPLIED>

<!ELEMENT value (#PCDATA | it | unicode)*>
    <!-- EMPTY  if oor:op="remove", xsi:nil="true", or oor:external is used
         #PCDATA  if the property type is a non-list type other than xs:string
         (#PCDATA | unicode)*  if the property type is xs:string
         #PCDATA  or  it*  if the property type is a list type other than
             oor:string-list
         (#PCDATA | unicode)*  or  it*  if the property type is
             oor:string-list -->
<!ATTLIST value
    xml:lang CDATA #IMPLIED
    oor:op (fuse | remove) #IMPLIED
    xsi:nil (true | false) #IMPLIED
    oor:type
        (xs:boolean | xs:short | xs:int | xs:long | xs:double | xs:string |
         xs:hexBinary | oor:boolean-list | oor:short-list | oor:int-list |
         oor:long-list | oor:double-list | oor:string-list | oor:hexBinary-list)
        #IMPLIED
    oor:separator CDATA #IMPLIED
    oor:external CDATA #IMPLIED
    install:module CDATA #IMPLIED>
    <!-- xml:lang  must only be used for localized properties; defaults to the
             empty string
         oor:op  defaults to "fuse"; "remove" must only be used for localized
             properties
         xsi:nil  defaults to "false"; "true" must only be used for nillable
             properties
         oor:type  is relevant for localized properties of type oor:any with
             different value types for different locales
         oor:separator  must only be used if the property type is a list type
             and the element content is #PCDATA or (#PCDATA | unicode)* (and not
             EMPTY or it*)
         oor:external  must only be used for non-localized properties and must
             not be used together with xsi:nil="true" -->

<!ELEMENT it (#PCDATA | unicode)*>
    <!-- #PCDATA  if the property type is a list type other than
             oor:string-list
         (#PCDATA | unicode)*  if the property type is oor:string-list -->
<!ATTLIST it>

<!ELEMENT unicode EMPTY>
<!ATTLIST unicode
    oor:scalar NMTOKEN #REQUIRED>
        <!-- must syntactically match xs:integer and have a value in {0, ..., 8,
             11, 12, 14, ..., 31, 65534, 65535} -->

<!-- oor:items is an alternative root element to oor:component-data (in plain
     .xcu files only; not when nested in an .xcd file), used for the user-layer
     registrymodifications.xcu: -->

<!ELEMENT oor:items (item*)>
<!ATTLIST oor:items>

<!ELEMENT item ((node | prop | value)*)>
<!ATTLIST item
    oor:path CDATA #REQUIRED>
        <!-- the absolute path representation of a localized property or a group
             or set node -->
