I've been working on a broken ADT. I had a known-good message and a slightly wrong one, and I needed a corrected copy by taking a few fields from one into the other.
The usual way is miserable. You count pipes, you copy a value, you miss a caret, you invent a new bug. I have done that more times than I want to admit.
Firstly, what are you actually trying to do?
You are not merging documents. You are deciding, field by field, which version of a patient fact should win. Birth place should be Wellington, not London. Patient class should stay inpatient. A pending location that only exists on one side should be created rather than left off. The clinical meaning comes first. The pipes are just how it is written down.
I already showed how to see those differences in the browser. Tools, Compare, in HL7 Soup Online. Semantic list on the left, text on the right. This is the next step. Once you can see PID-23, how do you fix it without counting?
Each difference row has two small buttons. << and >>.
<< takes the right value into the left. >> takes the left value into the right. The arrow points at the side that will change. I keep forgetting that for the first ten seconds, then it does what it says on the tin.
Keyboard works too. Select a difference, left arrow or right arrow. You can walk the list quite quickly.
In my case the top bar said PID-23 Birth Place. Left: London. Right: Wellington. I wanted the left message to be the corrected one, so I hit << and London became Wellington. The list updated immediately.
If a path only exists on one side, << is disabled. You cannot take a right-hand value that is not there. The tooltip is honest about it: cannot take the right value because this path is not present on the right. >> then becomes something more useful. Take the left value into the right and create the missing HL7 structure.
That is the standout bit. It will pad out the fields or the segment so the path can exist. No hand-building a PV1 just so field 16 has somewhere to sit. I tripped up on this years ago in raw editors, adding pipes until the field "looked" like it landed in the right place. It often didn't.
That is also the part that feels different from the Windows HL7 Soup editor. Compare I can do in a few tools. This field-by-field merge, including creating the missing structure, is the browser one I keep coming back to.
Revert Block sits under the text compare. Undo the block you just merged if you picked the wrong way. I used it. More than once.
Keep going and the field rows roll up. Once enough of PID matches, the individual PID-5.2 and PID-23 rows collapse into a single PID CHANGED. A bit surprising the first time. The list you were working down changes as you go. Keep picking.
I started with about twenty-five semantic differences and drove them down to none.
The empty state says: No semantic differences were found between these two HL7 messages.
A few things this is not.
It is two-way only. There is no base message, no three-way compare, no conflict marker. You are the arbiter. Last write wins per field. If you needed a proper ancestor merge you are in the wrong tool, and I would rather it said so than pretend.
There is no "save merged as a new message" button. The merged text is just the left and right editors. Copy the result out yourself. Treat them as a working copy.
You still paste the right-hand side. You cannot pick two messages from the loaded list inside the dialog. Same limitation as the compare post.
And please do not paste PHI into the online app. Use synthetic data, or anonymize first. Real patient messages stay in desktop HL7 Soup, or in HL7 Soup Web if you want the browser editor with the data staying on your own machine. A share link puts the message in the URL after the #, so it is not sent to the server, but that is not encryption. I would still only share a fake.
If you want to click around on a synthetic ADT^A04 from the built-in samples, this opens one in HL7 Soup Online:
Open the sample ADT^A04 in HL7 Soup Online
One ADT is about 1.9 KB of URL. Fine for a sample. Painful if you tried to stuff a real batch in there. The message is in the link, so treat the link like the message.
Anyway. Known-good on one side, broken on the other, cherry-pick the fields that matter, copy the winner out. No pipe counting. That is the whole trick.




