For in-line changes, DiffMk works fine, wrapping changes in tagged markers exactly as advertised. For changes to structural elements, however, it is reliably incorrect. When adding a PARA element, for example, it will wrap the content of the PARA element in a new element, and then also mark the following sibling PARA element as "added". This holds true for sections, chapters, books, etc. Adding one element results in the following sibling being marked as "added".
For example:
old.xml
-------
<article>
<title>This is the title</title>
<para>para1</para>
<para>para2</para>
</article>
new.xml
-------
<article>
<title>This is the title</title>
<para>para1</para>
<para>para3</para>
<para>para2</para>
</article>
output.xml
----------
<article diffmk:version="3.0" xmlns:diffmk="http://diffmk.sf.net/ns/diff">
<title>This is the title</title>
<para>para1</para>
<para><diffmk:wrapper diffmk:change="added">para3</diffmk:wrapper></para>
<para diffmk:change="added">para2</para>
</article>
The problem affects only the following sibling; if the element is that last child element in its branch, then the next elements on the tree are unaffected. If there are more than one siblings following the affected element, they are untouched.
I've tested with different files, different encodings, different dtds; it doesn't seem to make any difference.