3

この質問では、質問者は次のようにドキュメントを変換したいと考えています。

<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>

そこでの回答で指摘したように、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

もちろん、いったんzipWithIndexジッパーを -ed すると、もはやジッパーはありません。定義が でIndexedSeqあるため、 - を持つことはできません。Zipper[(Node, Int)]trait Zipper[+A <: Node] ...

アンチ XML ジッパーを使用するクリーンな方法はありますzipか?zipWithIndexmap

4

1 に答える 1

2

必要なものを達成するための直接的な方法は考えられませんが、低レベルの関数を使用する場合は、次のように使用できます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

ジッパーはランダム アクセス コンテナーであるため、この場合は効率が問題になることはありません。

于 2012-06-22T16:15:31.080 に答える