我正在尝试替换 XML 片段,并且需要一个累加器。假设我有一个以 XML 格式存储的填空问题,如下所示:
val q = <text>The capitals of Bolivia are <blank/> and <blank/>.</text>
在某些时候,我想要将这些空白转换为 HTML 输入元素,并且我需要能够区分第一个和第二个,以便我可以检查它们。(忽略这样一个事实,在这种情况下,两个大写字母可以按任意顺序出现——这是我稍后会处理的一个令人头疼的问题。)
感谢 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>
这是问题。有没有一种简单的方法可以避免每次替换 a 时我必须做的突变<blank/>
?我所拥有的并没有让我觉得可怕,但我认为如果我BlankReplacer
每次必须将问题转换为 HTML 时都没有创建该类的新实例,这可能会更清晰。我确信有某种方法可以将它变成一个累加器,但我不知道该怎么做。
谢谢!托德