On Mon, May 28, 2012 at 7:27 PM, Spencer Tickner
<spencertickner@xxxxxxxxx> wrote:
> Hi Ihe,
>
> Thanks for walking though the solution as I'm sure it will help
> others. Amazingly my mindset was exactly the same as yours, trying the
> XPath remove and replace before tearing some hair out an moving to the
> key solution proposed by David.
>
> As with any sample code I have run into a fringe scenario that has got
> me thinking of the "context" that the "use" statement,, ummm, uses.
> The fringe scenario comes up with nested allowable elements:
>
> <?xml version="1.0"?>
> <root>
> <change-begin/>
> <a>
> <p>Foo<change-end/></p>
> </a>
> <change-begin/>
> <b>
> <d>
> <t>Bar</t>
> </d>
> <d>
> <t>Foo <p>This</p> whatever</t>
> </d>
> </b>
> <change-end/>
> <p>Nothing <change-begin/>to worry<change-end/> about</p>
> <!-- Fringe scenario -->
> <b>
> <d>
> <t><change-begin/>This <p>and</p> <t>That</t> and
<p>that and </p> a</t>
> </d>
> </b>
> <change-end/>
> </root>
>
> In the last case the key puts the <change-end/> in the wrong spot
> (attributes added to show context:
>
> Output: <t preceding="0" ancestor-self="1"><change-begin/>This <p
> preceding="0" ancestor-self="2">and</p> <t preceding="1"
> ancestor-self="2">That</t> and <p preceding="2" ancestor-self="2">that
> and <change-end/></p> a</t>
>
> Desired Output: <t preceding="0" ancestor-self="1"><change-begin/>This
> <p preceding="0" ancestor-self="2">and</p> <t preceding="1"
> ancestor-self="2">That</t> and <p preceding="2" ancestor-self="2">that
> and </p> a<change-end/></t>
>
Here's another idea which might be a bit more robust.
Why not redefine the concept of an allowable element. Right now it's
p|t but it could be (refined p)|(refined t) or anything you want.
Define a key indexing the allowable elements.
Then change the cb and ce keys to anchor to one of the allowable
elements rather than p|t.
|