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拉链上使用zipWithIndexIndexedSeq,用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

请注意,拉链是一个随机访问容器,因此在这种情况下,效率不应该是一个问题。

07-24 09:30