HXTは木構造から木構造への変換は簡単にできますが、その他のことをしようとすると結構厄介です。下の例のように単にタグの数を数える場合でも、ステートを使ったほうがやりやすいのではないかと思います。
{-# LANGUAGE Arrows #-}
module Main (main) where
import Control.Monad
import System.Environment
import Text.XML.HXT.Arrow
main :: IO ()
main = do
args <- getArgs
let src = args !! 0
tag = args !! 1
(s, _) <- runIOSLA (readDocument [(a_validate, v_0)] src >>> count tag) (initialState 0) undefined
print $ xio_userState s
return ()
count tag = (hasName tag >>> changeUserState (const (+1)) >>> none) <+>
(processChildren $ count tag)