在this question中,询问者希望这样转换文档:
<text>
The capitals of Bolivia are <blank/> and <blank/>.
</text>
进入这个:
<text>
The capitals of Bolivia are <input name="blank.1"> and <input name="blank.2">.
</text>
正如我在my answer there中指出的,Anti-XML为这个问题提供了一个干净的解决方案。例如,下面将对重命名空元素进行工作:
import com.codecommit.antixml._
val q = <text>The capitals of Bolivia are <blank/> and <blank/>.</text>.convert
(q \\ "blank").map(_.copy(name = "input")).unselect
不幸的是,以下方法不起作用:
(q \\ "blank").zipWithIndex.map { case (el, i) => el.copy(
name = "input",
attrs = Attributes("name" -> "blank.%d".format(i + 1))
)}.unselect
当然,一旦我们把拉链拉上,我们就不再有拉链了,我们就不能有拉链了,因为定义是。
有没有一种干净的方法可以在反xml拉链上使用
zipWithIndex
或IndexedSeq
,用Zipper[(Node, Int)]
做一些其他操作,最后得到仍然是拉链的东西? 最佳答案
我想不出一个直接的方法来实现您的需求,但是如果您愿意使用较低级别的功能,您可以使用fold
,例如:
val blanks = q \\ "blank"
(0 until blanks.size).foldLeft(blanks) {case (z, i) => z.updated(i, z(i).copy(
name = "input",
attrs = Attributes("name" -> "blank.%d".format(i + 1)))
)}.unselect
请注意,拉链是一个随机访问容器,因此在这种情况下,效率不应该是一个问题。