Ihr Original-Code korrekt zu sein scheint. Das Problem ist nicht, dass es nicht rekursiv funktioniert (es tut), sondern ein seltsames Problem, das auftritt, wenn es genau ein vorhandenes Attribut gibt.
Blick auf die folgenden, die im Wesentlichen identisch mit Ihrem Code ist außer ich einige print-Anweisungen für das Debuggen hinzugefügt haben:
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)
Jetzt haben wir es testen:
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>
Wir sehen, dass für Bei einem Element ohne Attribute führt die Transformation dazu, dass das neue Attribut hinzugefügt wird und das zurückgegebene Ergebnis ebenfalls korrekt ist. (Ich weiß nicht, warum die Transformation zweimal auftritt.)
Wenn es jedoch ein existierendes Attribut:
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>
Das Ergebnis der Transformation korrekt ist, aber es wird auf den letzten nicht weitergegeben Ergebnis!
Aber wenn es zwei (oder mehr) vorhandene Attribute ist, ist alles in Ordnung:
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>
Ich bin versucht zu glauben, dies ein Fehler in der Bibliothek ist.Hier
Siehe auch http://stackoverflow.com/questions/970675/scala-modifying-nested-elements-in-xml – GClaramunt
Meine aktuelle Lösung ist eine modifizierte Version Ihrer Antwort in diesem Thread, sehr geschätzt. – parsa