如何替换HXT中的节点?

时间:2012-02-28 13:59:13

标签: xml haskell hxt

给出一个示例xml文件:

<root>
  <tag attr="value">Content</tag>
  <tag attr="value2">Content</tag>
</root>

如何用不同的标签替换每个tag,以便获得不同的文件:

<root>
  <tag2 attr2="value"/>
  <tag2 attr2="value2"/>
</root>

文档[1]似乎使用过滤器,有没有办法用箭头来完成这个?


更新

我现在可以替换这样的节点:

runX $ readDocument [] "in.xml" 
       >>> processTopDown( 
               (eelem "tag2" += sattr "attr2" "XXX" ) 
               `when` (isElem >>> hasName "tag") ) 
       >>> writeDocument [] "test.xml"

但我不知道如何使属性正确。


[1] http://www.haskell.org/haskellwiki/HXT#Transform_external_references_into_absolute_reference

1 个答案:

答案 0 :(得分:2)

Text.XML.HXT.XmlArrow尝试setElemNameprocessAttrlchangeAttrName

runX $ readDocument [] "in.xml" >>> transform >>> writeDocument [] "test.xml"
  where
    transform = processTopDown $
      ( setElemName (mkName "tag2") >>>
        processAttrl (changeAttrName $ mkName . attrMap . localPart)
      ) `when` (isElem >>> hasName "tag")
    attrMap "attr" = "attr2"
    attrMap a = a

这适用于我的样本文档。