XML の一部を置き換えようとしていますが、途中でアキュムレータが必要です。次のような XML として保存された穴埋め問題があるとします。
val q = <text>The capitals of Bolivia are <blank/> and <blank/>.</text>
ある時点で、これらの空白を HTML 入力要素に変換したいと思うでしょう。最初と 2 番目を区別してチェックできるようにする必要があります。(この場合、2 つの大文字がどちらの順序でも表示される可能性があるという事実は無視してください。これは、後で扱う頭痛の種です。)
StackOverflow に関する素敵な回答のおかげで、次のソリューションを作成しました。
import scala.xml._
import scala.xml.transform._
class BlankReplacer extends BasicTransformer {
var i = 0
override def transform(n: Node): NodeSeq = n match {
case <blank/> => {
i += 1
<input name={ "blank.%d".format(i) }/>
}
case elem: Elem => elem.copy(child=elem.child.flatMap(transform _))
case _ => n
}
}
これはかなりうまく機能します。new BlankReplacer()
再番号付けを開始するたびに を作成する必要がありますが、ほとんど機能します。
scala> new BlankReplacer()(q)
res6: scala.xml.Node = <text>The capitals of Bolivia are <input name="blank.1"></input> and <input name="blank.2"></input>.</text>
これが質問です。を置き換えるたびに行わなければならない突然変異を避ける簡単な方法はあり<blank/>
ますか? 私が持っているものは恐ろしいものではありませんがBlankReplacer
、質問を HTML に変換する必要があるたびにクラスの新しいインスタンスを作成していなければ、これはよりきれいになると思います。これをアキュムレータに変換する方法があると確信していますが、その方法がわかりません。
ありがとう!トッド