Su código original parece ser correcta. El problema no es que no funcione recursivamente (sí), sino un problema extraño que ocurre cuando hay exactamente un atributo existente.
vistazo a la siguiente, que es básicamente idéntica a su código, excepto que he añadido algunas declaraciones de impresión para la depuración:
val rule = new RewriteRule() {
override def transform(node: Node): Seq[Node] = {
println("transforming '" + node + "'")
val result = node match {
case elem @ Elem(prefix, label @ "bar", attribs, scope, children @ _*) =>
Elem(prefix, label, attribs append Attribute(None, "newKey", Text("newValue"), Null), scope, children: _*)
case other => other
}
println("result: '" + result + "'")
result
}
}
object xf extends RuleTransformer(rule)
Ahora probarlo:
scala> xf { <bar/> }
transforming '<bar></bar>'
result: '<bar newKey="newValue"></bar>'
transforming '<bar></bar>'
result: '<bar newKey="newValue"></bar>'
res0: scala.xml.Node = <bar newKey="newValue"></bar>
Vemos que para un elemento sin atributos, la transformación da como resultado la adición del nuevo atributo y el resultado devuelto también es correcto. (No sé por qué la transformación se produce dos veces.)
Sin embargo, cuando hay un atributo existente:
scala> xf { <bar key1="value1"/> }
transforming '<bar key1="value1"></bar>'
result: '<bar key1="value1" newKey="newValue"></bar>'
res1: scala.xml.Node = <bar key1="value1"></bar>
El resultado de la transformación es correcta, pero no se propaga a la final ¡resultado!
Pero cuando hay dos (o más) los atributos existentes, todo está bien:
scala> xf { <bar key1="value1" key2="value2"/> }
transforming '<bar key1="value1" key2="value2"></bar>'
result: '<bar key2="value2" key1="value1" newKey="newValue"></bar>'
transforming '<bar key1="value1" key2="value2"></bar>'
result: '<bar key2="value2" key1="value1" newKey="newValue"></bar>'
res2: scala.xml.Node = <bar key2="value2" key1="value1" newKey="newValue"></bar>
estoy tentado a creer que esto es un error en la biblioteca.
Véase también http://stackoverflow.com/questions/970675/scala-modifying-nested-elements-in-xml – GClaramunt
Mi solución real es una versión modificada de su respuesta en ese hilo, muy apreciada. – parsa