
Hi Henry,
I have just spent many hours staring at code and losing some hair. My hope is to save you the same experience someday. Here was my goal:
Take some XML, like <photo url="somewhere" align="left" alt=""/> and replace the align attribute with a class attribute, but only if the value of the align attribute was not null. This led to to followed (hugely condensed) attempts:
you could try the following: ------------------------------------ module Align where import Text.XML.HXT.Core doc = concat $ [ "<collection>" , "<photo url='somewhere' align='left' alt=''/>" , "<photo url='somewhere' align='' alt=''/>" , "</collection>" ] main = runX ( constA doc >>> readFromString [] >>> writeDocument [withIndent yes] "" >>> modifyAlt >>> writeDocument [withIndent yes] "" ) modifyAlt = processTopDownUntil (isPhotoWithNonEmptyAlign `guards` addClassAttr) isPhotoWithNonEmptyAlign = hasName "photo" >>> hasAttrValue "align" (not .null) addClassAttr = addAttr "class" "someclass" >>> removeAttr "align" ------------------------------------ Cheers, Uwe