I am still making sure I understand the existing code completely. Adding lots of comments.
I was not going to allow wild-cards in the forEach parameter. Can you think of a use case?
Your second point is covered. At this point my plan is to scrap skipTag, replacing it with equivalent inline code. Then after I have found some way of recording //tagnames within the node tree (I am considering the fact that currently it is invalid for the rootNode to have attributes; and I was thinking of abusing the rootNode attributes field and using it to store //tagname Node trees). Then where skipTag would currently be called, I would instead compare the parsed localname against the "attributes" of the rootTag.
Potential issues I intend to ignored are. If we have:
column="d" xpath="/a/b/c/d" flatten="true"
and the XML stream contains
Then I will not populate column 'e'. Also the expression for column 'd' which is an absolute Xpath takes precedence over that for column 'e'.