[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [office-comment] Proposal to improve change tracking in ODF
I have been asked to include the design document and RelaxNG, which are attached. Robin Robin LaFontaine wrote: > Proposal to improve change tracking in ODF > > The existing ODF track change mechanism is limited in its scope and some > of its semantics are not well defined. Limitations (based on OOo > implementation) include: > - insert/delete/modify of format or style changes > - table cell/row/column insert/delete > - image insert/delete/modify > - add/delete frames (obect, image, text frame) > > We were asked to look at these issues and the attached document lists > the requirements that were identified for an improved tracked changes > representation in ODF, and work done to propose a solution. The overall > objective was to develop a more generic approach which would widen the > selection of ODF elements and attributes where changes can be tracked. > This will provide improved support for applications needing to represent > changes. > > The proposal includes a RelaxNG grammar for a track change format, which > can work either as a complementary grammar to ODF or integrated with it > (and a partial integration with CD05 is included). Also include are: > - a Schematron checker for a document with tracked changes, > - over 50 examples of how it would work for specific changes > (hand-crafted but checked against Schematron and the grammar), > - XSLT code to extract the latest version of a document from a > tracked-change document, > - XSLT code to roll-back the latest change > > This is too large to attach to this email so a copy of the documentation > of the format and all the supporting code can be downloaded here: > http://www.deltaxml.com/library/articles-and-papers.html > > We would like the technical committee to consider this approach and > adopting it as a complementary grammar and/or integrated with ODF > RelaxNG (where they are the experts and will do a better job than we are > able to do!). > > We hope this will prove useful in the development of ODF. > > Best regards, > Robin > -- -- ----------------------------------------------------------------- Robin La Fontaine, Director, DeltaXML Ltd "Change control for XML" T: +44 1684 592 144 E: robin.lafontaine@deltaxml.com http://www.deltaxml.com Registered in England 02528681 Reg. Office: Monsell House, WR8 0QN, UK
<?xml version="1.0" encoding="UTF-8"?> <!-- Copyright (c) 2010 DeltaXML Ltd. All rights reserved. --> <!-- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details (a copy is included in the LICENSE-LGPL.txt file that accompanied this code). You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/> --> <!-- $Id: delta-format.rng 6836 2010-07-30 14:15:03Z nigelw $ --> <grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ac="http://www.deltaxml.com/ns/track-changes/attribute-change-namespace" xmlns:delta="http://www.deltaxml.com/ns/track-changes/delta-namespace" xmlns:split="http://www.deltaxml.com/ns/track-changes/split-namespace"> <!-- PATTERNS TO ALLOW INTEGRATION WITH HOST FORMAT --> <!-- Level 1 patterns --> <!-- combine these attributes with all elements, unless they have no attributes and are required exactly once in the grammar --> <define name="delta-level1-attributes"> <!-- Rule 2 --> <ref name="delta-allow-attribute-changes"/> <!-- Rule 3 --> <ref name="delta-insertion-with-content-attributes"/> </define> <!-- combine this rule with the content of any elements which allow non-mixed or element only content --> <define name="delta-level1-content"> <!-- Rule 4 --> <zeroOrMore> <ref name="delta-removed-content"/> </zeroOrMore> </define> <!-- combine this with the content of any elements allowing mixed content (ie. content which uses <mixed> or 'interleaves' <text/>) --> <define name="delta-level1-mixed-content"> <zeroOrMore> <choice> <!-- Rule 4 --> <ref name="delta-removed-content"/> <!-- Rule 5 --> <ref name="delta-allow-insert-text"/> </choice> </zeroOrMore> </define> <!-- Level 2 Patterns. Usage Notes: For each element either add: delta-level2-attributes or delta-level2-wrapper-attributes or add neither iff no attributes and required-once element Also also combine either: delta-level2-content or delta-level2-mixed-content to any element with any (non-attribute) content. --> <!-- combine these attributes with most elements, unless they have no attributes and are required exactly once in the grammar --> <define name="delta-level2-attributes"> <!-- Rule 2 --> <ref name="delta-allow-attribute-changes"/> <!-- Rule 9 --> <ref name="delta-split-parent-attributes"/> <optional> <choice> <!-- Rule 3 --> <ref name="delta-insertion-with-content-attributes"/> <!-- Rule 6 --> <ref name="delta-insertion-around-content-attributes"/> <!-- Rule 9 --> <ref name="delta-split-child-attributes"/> </choice> </optional> </define> <!-- This pattern is appropriate for combining with an element such as text:span which is a formatting element and has no other structural semantics, hence insert/remove with content is not appropriate --> <define name="delta-level2-wrapper-attributes"> <!-- Rule 2 --> <ref name="delta-allow-attribute-changes"/> <optional> <!-- Rule 6 --> <ref name="delta-insertion-around-content-attributes"/> </optional> </define> <!-- combine this rule with the content of any elements which allow non-mixed or element only content --> <define name="delta-level2-content"> <!-- Rule 8 --> <ref name="delta-allow-delta-elements"/> </define> <!-- combine this with the content of any elements allowing mixed content (ie: content which uses <mixed> or 'interleaves' <text/>) --> <define name="delta-level2-mixed-content"> <interleave> <!-- Rule 8 --> <ref name="delta-allow-delta-elements"/> <!-- Rule 5 --> <ref name="delta-allow-insert-text"/> </interleave> </define> <!-- PATTERNS TO REPRESENT RULES FOR INTEGRATION WITH HOST FORMAT --> <!-- Rule 1 --> <define name="delta-change-transaction-definitions"> <ref name="delta-tracked-changes"/> </define> <!-- Rule 2 --> <define name="delta-allow-attribute-changes"> <zeroOrMore> <attribute> <nsName ns="http://www.deltaxml.com/ns/track-changes/attribute-change-namespace"/> </attribute> </zeroOrMore> </define> <!-- Rule 3 --> <define name="delta-insertion-with-content-attributes"> <attribute name="delta:insertion-type"> <value>insert-with-content</value> </attribute> <ref name="delta-insertion-change-idref"/> <optional> <ref name="delta-move-idref"/> </optional> </define> <!-- Rule 3 This definition is general and allows any content, but could be made more specific to a host format by defining the content according to Rule 3 --> <define name="delta-removed-content"> <element name="delta:removed-content"> <ref name="delta-removal-change-idref"/> <optional> <ref name="delta-move-id"/> </optional> <ref name="anycontent"/> </element> </define> <!-- Rule 4 (use Rule 8 instead of this for Level 2)--> <define name="delta-allow-removed-elements"> <zeroOrMore> <choice> <ref name="delta-removed-content"/> <ref name="delta-merge"/> </choice> </zeroOrMore> </define> <!-- Rule 5 --> <define name="delta-allow-insert-text"> <zeroOrMore> <choice> <ref name="delta-inserted-text-start"/> <ref name="delta-inserted-text-end"/> </choice> </zeroOrMore> </define> <!-- Rule 6 --> <define name="delta-insertion-around-content-attributes"> <attribute name="delta:insertion-type"> <value>insert-around-content</value> </attribute> <ref name="delta-insertion-change-idref"/> </define> <!-- Rule 8 --> <define name="delta-allow-delta-elements"> <zeroOrMore> <choice> <ref name="delta-remove-leaving-content-start"/> <ref name="delta-remove-leaving-content-end"/> <ref name="delta-removed-content"/> <ref name="delta-merge"/> </choice> </zeroOrMore> </define> <!-- Rule 9 --> <!-- The split parent is the original element that is split --> <define name="delta-split-parent-attributes"> <zeroOrMore> <ref name="delta-split-idref"/> </zeroOrMore> </define> <!-- Rule 9 --> <!-- The split child is the new element that is created/inserted by the split --> <define name="delta-split-child-attributes"> <attribute name="delta:insertion-type"> <value>split</value> </attribute> <ref name="delta-insertion-change-idref"/> <ref name="delta-split-id"/> </define> <!-- PATTERNS FOR MERGE --> <define name="delta-merge"> <element name="delta:merge"> <ref name="delta-removal-change-idref"/> <optional> <ref name="delta-move-id"/> </optional> <element name="delta:leading-partial-content"> <ref name="anycontent"/> </element> <element name="delta:intermediate-content"> <ref name="anyelement"/> </element> <element name="delta:trailing-partial-content"> <element> <anyName/> <ref name="anything"/> </element> </element> </element> </define> <!-- PATTERN FOR REMOVE-LEAVING-CONTENT ELEMENTS --> <define name="delta-remove-leaving-content-start"> <element name="delta:remove-leaving-content-start"> <ref name="delta-removal-change-idref"/> <ref name="delta-end-element-idref"/> <element> <anyName/> <ref name="anything"/> </element> </element> </define> <define name="delta-remove-leaving-content-end"> <element name="delta:remove-leaving-content-end"> <ref name="delta-end-element-id"/> </element> </define> <!-- PATTERNS FOR TEXT INSERTION AND REMOVAL --> <define name="delta-inserted-text-start"> <element name="delta:inserted-text-start"> <ref name="delta-insertion-change-idref"/> <ref name="delta-inserted-text-end-idref"/> <optional> <ref name="delta-move-idref"/> </optional> </element> </define> <define name="delta-inserted-text-end"> <element name="delta:inserted-text-end"> <ref name="delta-inserted-text-end-id"/> </element> </define> <!-- ATRIBUTES FOR IDs AND IDrefs --> <define name="delta-split-id"> <attribute name="delta:split-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-split-idref"> <attribute> <nsName ns="http://www.deltaxml.com/ns/track-changes/split-namespace"/> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-end-element-id"> <attribute name="delta:end-element-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-end-element-idref"> <attribute name="delta:end-element-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-move-id"> <attribute name="delta:move-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-move-idref"> <attribute name="delta:move-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-inserted-text-end-id"> <attribute name="delta:inserted-text-end-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-inserted-text-end-idref"> <attribute name="delta:inserted-text-end-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-change-id"> <attribute name="delta:change-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-change-idref"> <attribute name="delta:change-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-change-group-id"> <attribute name="delta:change-group-id"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-change-group-idref"> <attribute name="delta:change-group-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-insertion-change-idref"> <attribute name="delta:insertion-change-idref"> <ref name="delta-NCName"/> </attribute> </define> <define name="delta-removal-change-idref"> <attribute name="delta:removal-change-idref"> <ref name="delta-NCName"/> </attribute> </define> <!-- PATTERNS FOR MERGE SUPPORT ELEMENTS --> <define name="anycontent"> <zeroOrMore> <choice> <element> <anyName/> <ref name="anything"/> </element> <text/> </choice> </zeroOrMore> </define> <define name="anyelement"> <zeroOrMore> <element> <anyName/> <ref name="anything"/> </element> </zeroOrMore> </define> <define name="anything"> <zeroOrMore> <choice> <element> <anyName/> <ref name="anything"/> </element> <attribute> <anyName/> </attribute> <text/> </choice> </zeroOrMore> </define> <!-- PATTERNS FOR CHANGE TRANSACTIONS (CT) DEFINITIONS AND GROUPING --> <define name="delta-tracked-changes"> <element name="delta:tracked-changes"> <zeroOrMore> <choice> <ref name="delta-change-transaction"/> <ref name="delta-change-transaction-stack"/> <ref name="delta-change-transaction-set"/> </choice> </zeroOrMore> </element> </define> <define name="delta-change-transaction"> <element name="delta:change-transaction"> <ref name="delta-change-id"/> <ref name="delta-change-info"/> <optional> <ref name="delta-change-log"/> </optional> <optional> <ref name="delta-transaction-dependencies"/> </optional> </element> </define> <define name="delta-change-transaction-group"> <ref name="delta-change-group-id"/> <ref name="delta-change-info"/> <optional> <ref name="delta-change-log"/> </optional> <optional> <ref name="delta-change-references"/> </optional> </define> <define name="delta-change-transaction-stack"> <element name="delta:change-transaction-stack"> <ref name="delta-change-transaction-group"/> </element> </define> <define name="delta-change-transaction-set"> <element name="delta:change-transaction-set"> <ref name="delta-change-transaction-group"/> </element> </define> <define name="delta-change-references"> <element name="delta:change-references"> <oneOrMore> <choice> <ref name="delta-change-ref"/> <ref name="delta-change-group-ref"/> </choice> </oneOrMore> </element> </define> <define name="delta-transaction-dependencies"> <element name="delta:transaction-dependencies"> <oneOrMore> <element name="delta:transaction-dependency"> <attribute name="dependency-type"> <text/> </attribute> <ref name="delta-change-idref"/> </element> </oneOrMore> </element> </define> <define name="delta-change-ref"> <element name="delta:change-ref"> <ref name="delta-change-idref"/> </element> </define> <define name="delta-change-group-ref"> <element name="delta:change-group-ref"> <ref name="delta-change-group-idref"/> </element> </define> <define name="delta-change-log"> <element name="delta:change-log"> <!-- TBA info such as 'table cell merge', 'global edit' etc --> <ref name="anything"/> </element> </define> <define name="delta-change-info"> <element name="delta:change-info"> <optional> <ref name="delta-dc-creator"/> <ref name="delta-dc-date"/> </optional> </element> </define> <!-- BASIC DATA TYPES, using delta- as a prefix to avoid clashes with definitions in ODF --> <define name="delta-dc-creator"> <element name="dc:creator"> <data type="string"/> </element> </define> <define name="delta-dc-date"> <element name="dc:date"> <data type="dateTime"/> </element> </define> <define name="delta-NCName"> <data type="NCName"/> </define> </grammar>
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]