As diff3x is an XML representation we here consider going one step further and making use of the fact that the representation is hierarchical to support hierarchical or 'nested' change. A nested change is a change in one branch that modifies something that has been removed in another branch.
We will look at an XML example, showing nested changes.
Table 7. XML nested data example
A.xml | O.xml | B.xml |
---|---|---|
<author> <personname> <first>Nigel</first> <last>Whitaker</last> </personname> <address> <ph>01684 532141</ph> <st>Geraldine Rd</st> <city>Malvern</city> <country>UK</country> <post>WR14 3SZ</post> </address> </author> |
<author> <personname> <first>Nigel</first> <last>Whitaker</last> </personname> <address> <st>Geraldine Rd</st> <city>Malvern</city> <country>UK</country> <post>WR14 3SZ</post> </address> </author> |
<author> <personname> <first>Nigel</first> <last>Whitaker</last> </personname> </author> |
In the above example one branch, B.xml
, has deleted the
address
sub-tree which the other branch has modified with an added
phone
number. As we are now using an XML representation that has a
tree structure we can also make use of this structure in the result.
In order to distinguish between a simple <ao>
option and a nested choice, we
introduce the <aoChoice>
element. This is a mixed content element that can include
<a>
or <o>
elements as well as text.
<d:diff3x a="A.xml" b="B.xml" o="O.xml"><![CDATA[ <author> <personname> <first>Nigel</first> <last>Whitaker</last> </personname>]]> <d:choice3> <d:aoChoice include="true"><![CDATA[ <address>]]> <d:a><![CDATA[ <ph>+44 1684 532141</ph>]]> </d:a> <![CDATA[ <st>Geraldine Rd</st> <city>Malvern</city> <country>UK</country> <post>WR14 3SZ</post> </address>]]> </d:aoChoice> <d:bChoice/> </d:choice3><![CDATA[ </author>]]> </d:diff3x>
Here we can see that by allowing nested change we can avoid the repetition and make it easier for a human to understand. However, in order to support this in the format we have to introduce quite a number of new elements and different rules. This adds to the complexity of the format and moves us a lot further away from the original elegant simplicity of diff3. Keeping diff3x as simple as possible seems preferable to including the ability to represent a subset of changes as nested changes.
For this reason we have elected not to include the ability to represent nested changes in diff3x.